SubversionのプロパティリストをPerlのデータ構造に変換する方法

% 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}/が入ってるとおかしくなるけど、それは内緒。