@kyanny's blog

My life. Opinions are my own.

YAML でフロースタイルのシーケンス(配列)ではないことを明示するにはどうすればいいのだろう

さらに追記

http://d.hatena.ne.jp/a666666/20090407/1239068717#c1239083380 でコメントをもらったように、Perl で書き下して YAML::Dump すれば良い話でした。。

追記

http://d.hatena.ne.jp/a666666/20090407/1239068717#c1239070658 でコメントをもらったように、ダブルクォートで囲めば "[foo bar baz]" [] が文字列として解釈された。ありがとうございます。

しかし今度は、 "hoge" が hoge になってしまう・・・アクセスログをパースするプログラムの、正規表現のテストを書いているのだけど、あちらを立てればこちらがたたずといった具合で、次から次へとうまくいかないケースが。。 run_is_deeply とフィルタで済ませずに、テストをいくつかに分けてやればできないことはないので、悔しいけどもう yaml フィルタにこだわるのはやめよう。。


Test::Base の yaml フィルターを使っていたら、

- [foo bar baz]

みたいな記述が、 '[foo bar baz]' という文字列ではなくて無名配列と見なされてしまった。 YAML でぐぐってるびまを読んでみると、フロースタイルのシーケンス(配列)表現というものがあることを知った。けど、これを打ち消す方法がわからない。 !str とか !!str とかを前置するとデータ型を明示できるらしいので試してみたけど、うまくいかず。絶対回避方法があるはずだが・・・http://yaml.org/spec/current.html#flow%20sequence%20style/syntax:title仕様書のflow sequence の項をちらっと見てみたけど、書いてないように見える。 \ でエスケープしてみたら \ つきの文字列とみなされてしまうしなあ。

#!/usr/bin/perl
use strict;
use warnings;
use YAML;
use Test::More;
plan tests => 1;

my $yaml = <<'YAML';
---
- foo
- -
- bar
- [baz]

YAML
my $arrayref = [
    'foo',
    '-',
    'bar',
    '[baz]',
];

is_deeply(YAML::Load($yaml), $arrayref);
$ prove -v yaml2.pl 
yaml2....
1..1
not ok 1

#   Failed test at yaml2.pl line 23.
#     Structures begin differing at:
#          $got->[3] = ARRAY(0x810db0)
#     $expected->[3] = '[baz]'
# Looks like you failed 1 test of 1.
 Dubious, test returned 1 (wstat 256, 0x100)
 Failed 1/1 subtests 

Test Summary Report
-------------------
yaml2 (Wstat: 256 Tests: 1 Failed: 1)
  Failed test:  1
  Non-zero exit status: 1
Files=1, Tests=1,  0 wallclock secs ( 0.01 usr  0.00 sys +  0.06 cusr  0.01 csys =  0.08 CPU)
Result: FAIL