さらに追記
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