燈明ブログ

現状は小池啓仁の応援ブログ

サブルーチンの上書き(オーバーライド)?

id:fbisさんの記事で、以下のソースがスキル不足で読めなかったので、調べてみました。そのメモです。
実は、調べてもイマイチわからなかったのですが・・・。

 use Path::Class;
 use Perl6::Say;
 use Encode;

 no warnings 'redefine';
 local *IO::Dir::read = sub { decode 'shiftjis', readdir shift };

 for my $file ( dir('./hoge')->children ) {
     say encode 'shiftjis', $file->basename;
 }
http://d.hatena.ne.jp/fbis/20080711/1215749599
  • no warnings 'redefine';
    • IO::Dir::read を再定義するために、再定義をワーニングとしない。
  • local *IO::Dir::read = sub { decode 'shiftjis', readdir shift };
    • localの型グロブで宣言して、それに無名サブルーチンリファレンスを代入すると、同名のサブルーチンが上書き(オーバーライド)できる?
    • ちなみに、オリジナルのIO::Dir::readは、readdirのみで、decode 'shiftjis'されていない。
    • こちらは、decode 'shiftjis'で、'shiftjis'から'utf-8'へデコードしている。
  • for my $file ( dir('./hoge')->children ) {
    • Path::Class.pmのdirメソッドからPath::Class::dir.pmをコンストラクトして、そのメソッドchildrenを実行する。
    • すると、./hogeにあるファイルの名前のリストが取得できる。
  • say encode 'shiftjis', $file->basename;
    • sayは、改行付きprintか?
    • $file->basenameは、Path::Class::File.pmのオブジェクトのメソッドで、ファイル名を取得する。
    • 尚、フォルダの場合はbasenameでは取得できない。
    • encode 'shiftjisは、'utf-8'から'shiftjis'へエンードしている。