2006年09月30日

YAML::Syckの罠

YAML::SyckがインストールされているとCatalyst::Plugin::ConfigLoaderで正規表現が展開できません。

たとえばYAMLでPerlの正規表現を書く場合

foo: !perl/regexp:
 REGEXP: '^hoge$'
なんていう風に書きますが、YAML::Syckが入って居ると
'foo' => bless( {
 'REGEXP' => '^hoge$'
  }, 'regexp:' )
 },
なんていう風に展開されます。

ちなみにYAML::Syckなしの場合

'foo' => qr/(?-xism:(?:^hoge$))/
と正常に展開されます。

とりあえず、Catalystでは「http://search.cpan.org/src/AGRUNDMA/Catalyst-5.6902/lib/Catalyst/Plugin/ConfigLoader/YAML.pm」の

sub load {
   my $class = shift;
   my $file  = shift;

   eval { require YAML::Syck; };
   if( $@ ) {
       require YAML;
       return YAML::LoadFile( $file );
   }
   else {
       open( my $fh, $file ) or die $!;
       my $content = do { local $/; <$fh> };
       close $fh;
       return YAML::Syck::Load( $content );
   }
}
の辺りで、YAML::Syckが有ればそっちを優先する仕様になっているんですが、YAML::Syck自体が現時点ではダメダメなので、どうも鬼門になる模様

なので、YAML::Syckを入れてしまうと大変なことになるのですが、CPANで入れてしまったためアンインストールなんか存在しないというCPANの罠に引っかかりました。

ちなみに、たまたまCPANでのインストール時のログが残っていたためそれを元に以下を実行して無理矢理削除しました。

rm /usr/lib/perl5/site_perl/5.8.8/i586-linux-thread-multi/auto/YAML/Syck/Syck.so
rm /usr/lib/perl5/site_perl/5.8.8/i586-linux-thread-multi/auto/YAML/Syck/Syck.bs
rm /usr/lib/perl5/site_perl/5.8.8/i586-linux-thread-multi/YAML/Syck.pod
rm /usr/lib/perl5/site_perl/5.8.8/i586-linux-thread-multi/YAML/Syck.pm
rm /usr/lib/perl5/site_perl/5.8.8/i586-linux-thread-multi/YAML/Loader/Syck.pm
rm /usr/lib/perl5/site_perl/5.8.8/i586-linux-thread-multi/YAML/Dumper/Syck.pm
rm /usr/lib/perl5/site_perl/5.8.8/i586-linux-thread-multi/JSON/Syck.pm
rm /usr/share/man/man3/YAML::Syck.3pm
rm /usr/share/man/man3/JSON::Syck.3pm
rm /usr/lib/perl5/site_perl/5.8.8/i586-linux-threadmulti/auto/YAML/Syck/.packlist
これで、とりあえず削除できたようで正常に動作するようになりました。

やっぱりCPANはこれがこわいよなぁ・・・

Posted by Takuchan at 2006年09月30日 22:51 | トラックバック(0)