Perl日記

日々の知ったことのメモなどです。Perlは最近やってないです。

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::は」!
「あらゆる」!
名前空間を」!
「通じて」!
置き換えてくれるんじゃないのか…!




……寝る。