Почему я не могу переопределить встроенную печать Perl? - PullRequest
9 голосов
/ 21 сентября 2011

После этого примера ,

Я пытался переопределить print своим собственным:

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

Но оказывается, что это не работает, 2 все еще печатается вместо 1.

Почему?

Ответы [ 2 ]

12 голосов
/ 21 сентября 2011

Поскольку он имеет очень специальные правила синтаксического анализа, которые не могут быть реплицированы обычной функцией, оператор 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.

9 голосов
/ 21 сентября 2011

С этот ответ на другой вопрос:

Следующие ключевые слова не могут быть переопределены:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...