サブルーチンの上書き(オーバーライド)?
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 ) {
- say encode 'shiftjis', $file->basename;