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

Gre*_*con 13 perl

重写内置函数的perlsub文档的部分提供

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

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

最后,一些内置插件(例如 exists或者grep)不能被覆盖.

什么是完整清单?

Joh*_*lla 14

任何负值都toke.c可以被覆盖; 所有其他人可能没有.你可以在这里查看源代码.

例如,让我们看一下waitpid10,396行:

    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;
      }
Run Code Online (Sandbox Code Playgroud)

由于waitpid是否定的,可能会被覆盖.怎么样grep

        case 'r':
          if (name[2] == 'e' &&
              name[3] == 'p')
          {                                   /* grep       */
            return KEY_grep;
          }
Run Code Online (Sandbox Code Playgroud)

这是积极的,所以它不能被覆盖.这意味着无法覆盖以下关键字:

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

  • 这个例子是通过将`glob`符号导出到调用包而不是替换`CORE :: GLOBAL ::`中的符号来实现的. (3认同)

Cha*_*ens 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";
}
Run Code Online (Sandbox Code Playgroud)

  • 还有一些魔法允许覆盖`do`,`require`和`glob`.请参阅`perlsub`了解(如果不是如何以及为什么). (3认同)