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

new*_*erl 9 perl

按照这个例子,

我试图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.


Jon*_*rdy 9

这个答案到另一个问题:

无法覆盖以下关键字:

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