该重写内置函数的perlsub文档的部分提供
当您希望在任何地方覆盖内置函数时,有时会使用第二种方法,而不考虑名称空间边界.这是通过将sub导入特殊命名空间来实现的
CORE::GLOBAL::.
然后举几个例子.然而,最后是
最后,一些内置插件(例如
exists或者grep)不能被覆盖.
什么是完整清单?
Perl对readline函数(以及等效的<>I/O运算符)进行了一些特殊处理,它处理表达式
while (<HANDLE>)
while (readline(HANDLE))
Run Code Online (Sandbox Code Playgroud)
相当于
while (defined($_ = <HANDLE>))
Run Code Online (Sandbox Code Playgroud)
比照
$ perl -MO=Deparse -e 'f($_) while <>'
f($_) while defined($_ = <ARGV>); <--- implicitly sets $_
-e syntax OK
Run Code Online (Sandbox Code Playgroud)
但是如果你劫持这个readline功能,这种自动分配似乎不会发生:
$ perl -MO=Deparse -e 'BEGIN {
> *CORE::GLOBAL::readline = sub { }
> }
> f($_) while <>'
sub BEGIN {
*CORE::GLOBAL::readline = sub {
};
}
f($_) while readline(ARGV); <--- doesn't set $_ !
-e syntax OK
Run Code Online (Sandbox Code Playgroud)
当然,这会使自定义readline函数对许多遗留代码的工作不正确.这段代码的输出是"foo"BEGIN块, …
perl ×2