% svn proplist --verbose
で出てくるプロパティリストをPerlのデータ構造に変換しようと思ったんだけど、解析がちょっと面倒くさそう。
じっと見てるとYAMLっぽく見えてきたので、YAML::Syckでやったら割と簡単に変換できました。
#!/usr/bin/env perl # データの準備 # 実際は、use IO::All;$_ = io('svn pl -vR |')->all;みたいなことをしてる。 $_ = <<'EOF'; Properties on 'Makefile.PL': svn:executable : * svn:keywords : Id Properties on 'service/foo': svn:ignore : supervise Properties on 'service/foo/log': svn:ignore : supervise main error Properties on 'service/foo/log/run': svn:executable : * Properties on 'service/foo/run': svn:executable : * EOF # プロパティ値に改行が入っている場合があるので、ちょっと整形。 s{(?:\r\n|\r|\n)(?!(?:Properties|[ ]{2}))}{ }gmsx; # s{Properties\ on\ '([^']+)':}{$1:}gmsx; # (*)これを外すと、各キーがファイル名だけになる # 解析 use YAML::Syck; my $data = Load($_) # 出力 use Data::Dumper; print Dumper $data;
実行結果(あえてData::Dumperで出してみる)
% perl svnpl2perl $VAR1 = { 'Properties on \'service/foo/run\'' => { 'svn:executable' => '*' }, 'Properties on \'service/foo\'' => { 'svn:ignore' => 'supervise' }, 'Properties on \'Makefile.PL\'' => { 'svn:executable' => '*', 'svn:keywords' => 'Id' }, 'Properties on \'service/foo/log\'' => { 'svn:ignore' => 'supervise main error' }, 'Properties on \'service/foo/log/run\'' => { 'svn:executable' => '*' } };
(*)のコメントを外した時の実行結果
% perl svnpl2perl $VAR1 = { 'service/foo' => { 'svn:ignore' => 'supervise' }, 'service/foo/log/run' => { 'svn:executable' => '*' }, 'service/foo/log' => { 'svn:ignore' => 'supervise main error' }, 'service/foo/run' => { 'svn:executable' => '*' }, 'Makefile.PL' => { 'svn:executable' => '*', 'svn:keywords' => 'Id' } };
プロパティ値に/\n[ ]{2}/が入ってるとおかしくなるけど、それは内緒。