Re: CORE::もCORE::GLOBALも動かない?

CORE::もCORE::GLOBALも動かない?

組み込み関数すべてがオーバーライドできるわけではありません。printはオーバーライドできないもののひとつです。

オーバーライドできるかどうかは,組み込み関数のプロトタイプをサブルーチンプロトタイプで表現できるかどうかによります。以下に示すように,printはサブルーチンプロトタイプで表現できないような引数を受け取ることができるため,オーバーライドが禁止されています。

print "foo", "bar";        # 表現可能
print STDOUT "foo", "bar"; # 表現不可能

同様に,map, system, foreach などもサブルーチンプロトタイプで表現できないため,オーバーライドできません。

オーバーライドできるかどうかのは識別には,prototype組み込み関数が使えます。

use 5.010;
sub is_overridable {
    my($name) = @_;
    return defined( prototype("CORE::" . $name) );
}
say is_overridable("hex");   # 1
say is_overridable("print"); # (nothing)

ワンライナなら,Fatal.pmを使って調べることもできます。

$ perl -MFatal=print -e ''
Cannot make the non-overridable builtin print fatal at -e line 0
BEGIN failed--compilation aborted.
$ perl -MFatal=hex -e ''
$

See also perldoc -f prototype.