按照这个例子,
我试图print用自己的方式覆盖:
BEGIN {*CORE::GLOBAL::print = sub {print 1};}
print 2;
Run Code Online (Sandbox Code Playgroud)
但事实证明它不起作用,2仍然是打印而不是1.
为什么?
ike*_*ami 12
因为它具有非常特殊的解析规则,无法通过普通函数复制,print所以无法覆盖运算符.
print "foo\n";
print { *STDOUT } "foo\n";
Run Code Online (Sandbox Code Playgroud)
您可以找出可以使用的覆盖哪些运算符 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
Run Code Online (Sandbox Code Playgroud)
PS - 如果您的代码实际被覆盖,您将拥有无限循环print.
从这个答案到另一个问题:
无法覆盖以下关键字:
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