为什么我不能覆盖Perl的内置打印?

时间:2011-09-21 06:03:16

标签: perl

关注this example

我尝试用自己的代码覆盖print

BEGIN {*CORE::GLOBAL::print = sub {print 1};}
print 2;

但事实证明它不起作用,2仍然打印而不是1

为什么?

2 个答案:

答案 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