CORE::もCORE::GLOBALも動かない?
「実用Perlプログラミング」の中にあったCORE::もCORE::GLOBALもうまく動かなかったのでメモ。
なぜだあああああ。
CORE::
CORE::は常に組み込み関数を参照します。
CORE::でprint()サブルーチンを書き直す。
package MyPrint; use strict; use base qw(Exporter); our @EXPORT = qw(print); sub print { CORE::print('MyPrint : ', @_); } 1; __END__
#!/usr/bin/perl use MyPrint; print 'ID -> rightgo09', qq{\n}; #=> ID -> rightgo09
あっれー、どうして前に'MyPrint :'がつかないんだろう。
use だからコンパイル時にMyPrint内は通ってるはずだから、printに括弧はいらないと思うんだけど。
一応括弧つけても同じ結果だった……。
CORE::GLOBAL::
一方CORE::GLOBAL::はあらゆる名前空間を通じて組み込み関数のバージョンを置き換えることができる実際にパッケージになります。
CORE::GLOBAL::でprint()サブルーチンを書き直す。
package MyPrint; use strict; *CORE::GLOBAL::print = sub { CORE::print('MyPrint : ', @_); }; 1; __END__
#!/usr/bin/perl use MyPrint; print 'ID -> rightgo09', qq{\n}; #=> ID -> rightgo09
なんでっっっっ!
「CORE::GLOBAL::は」!
「あらゆる」!
「名前空間を」!
「通じて」!
置き換えてくれるんじゃないのか…!
……寝る。