perlsub文档的Overriding Built-in Functions部分提供了
当您希望在任何地方覆盖内置函数时,有时会使用第二种方法,而不考虑名称空间边界。这是通过将子类导入特殊名称空间
CORE::GLOBAL::
来实现的。
然后举几个例子。然而,最后是
最后,某些内置插件(例如
exists
或grep
)无法覆盖。
完整清单是什么?
答案 0 :(得分:14)
toke.c
中任何否定的值都可以被覆盖;所有其他人可能没有。您可以查看源代码here。
例如,让我们看一下10,396行的waitpid
:
case 'w':
if (name[1] == 'a' &&
name[2] == 'i' &&
name[3] == 't' &&
name[4] == 'p' &&
name[5] == 'i' &&
name[6] == 'd')
{ /* waitpid */
return -KEY_waitpid;
}
由于waitpid
为负数,因此可能会被覆盖。 grep
怎么样?
case 'r':
if (name[2] == 'e' &&
name[3] == 'p')
{ /* grep */
return KEY_grep;
}
这是积极的,所以不能被覆盖。这意味着无法覆盖以下关键字:
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
答案 1 :(得分:5)
prototype
函数会告诉您是否可以覆盖CORE::
函数。
这是一个黑客共同尝试获取所有功能而无需键入它们:
#!/usr/bin/perl
use strict;
use warnings;
open my $fh, "-|", "perldoc", "-u", "perlfunc" or die $!;
my %seen;
while (<$fh>) {
next unless my ($func) = /=item ([a-z]\w+)/;
next if $seen{$func}++;
my $prototype = prototype "CORE::$func";
print "$func is ", defined $prototype ? "overiddable with $prototype " :
"not overiddable", "\n";
}
答案 2 :(得分:4)
之前有一个问题是如此哀悼mocking the filetest operators(-f
,-d
,-x
,......的难度......)
答案 3 :(得分:1)
可以模拟readline(HANDLE)
函数(以及等效的<HANDLE>
I / O运算符),但在使用时自动分配给$_
的行为
while (<HANDLE>) { ... # equivalent to while (defined($_=readline(HANDLE)))
不可能。请参阅How can I still get automatic assignment to '$_' with a mocked 'readline' function?处的hobbs评论。这意味着像
这样的代码while (<>) { # implicitly sets $_
do_something_with($_);
}
如果重新定义readline
,可能会中断。