■2004-03-28
* [Perl] COREとCORE::GLOBALの違い
FSWikiのプラグインをつくる過程で、組み込み関数の上書きについてちょっと勉強。PerlのCOREパッケージとCORE::GLOBALパッケージの違い。"Programming Perl, 3rd ed"でも触れられているのですが、この記事にもう少し詳しく違いが出ています。要は、CORE::
は常に組み込み関数を参照するけれども、その関数は実際にはこのシンボルテーブルに存在しているわけではないので、CORE::を使ってリファレンスは取得できない。他方、CORE::GLOBAL::
は本当のパッケージで、これを使って全名前空間にわたって組み込み関数を置換できるということ。
CORE::GLOBAL::exit = sub { print "this is exit!\n"; CORE::exit; # こっちは本当の組み込み関数を指す };
こうすると、どこでexitを使っても、このオーバーライドされたexitが呼び出されます(mod_perlでお馴染み)。 で、上の記事に出てくる引用は、まだ刊行されていない"Advanced Perl Programming, 2nd edition"だとか。