哪个Perl内置函数不能在CORE :: GLOBAL中重写?

时间:2010-09-09 17:13:25

标签: perl

perlsub文档的Overriding Built-in Functions部分提供了

  

当您希望在任何地方覆盖内置函数时,有时会使用第二种方法,而不考虑名称空间边界。这是通过将子类导入特殊名称空间CORE::GLOBAL::来实现的。

然后举几个例子。然而,最后是

  

最后,某些内置插件(例如 existsgrep)无法覆盖。

完整清单是什么?

4 个答案:

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

可能会中断。