关注this example,
我尝试用自己的代码覆盖print
:
BEGIN {*CORE::GLOBAL::print = sub {print 1};}
print 2;
但事实证明它不起作用,2
仍然打印而不是1
。
为什么?
答案 0 :(得分:12)
由于它具有非常特殊的解析规则,无法通过普通函数复制,因此无法覆盖print
运算符。
print "foo\n";
print { *STDOUT } "foo\n";
您可以使用prototype
>perl -E"say qq{$_: }, defined(prototype(qq{CORE::$_})) ? 'yes' : 'no' for @ARGV" print map time chr
print: no
map: no
time: yes
chr: yes
PS - 如果您的代码实际上已覆盖print
,则会有无限循环。
答案 1 :(得分:9)
从this answer到另一个问题:
以下关键字无法覆盖:
chop, defined, delete, do, dump, each, else, elsif, eval, exists, for, foreach, format, glob, goto, grep, if, keys, last, local, m, map, my, next, no, package, pop, pos, print, printf, prototype, push, q, qq, qw, qx, redo, return, s, scalar, shift, sort, splice, split, study, sub, tie, tied, tr, undef, unless, unshift, untie, until, use, while, y