2010-09-09 23 views
13

的perlsub文檔的Overriding Built-in Functions部分提供這Perl的內置插件無法在CORE :: GLOBAL被重寫?

還有,當你想重寫有時是適用的第二種方法的內置無處不在,而不考慮命名空間的邊界。這是通過將一個子文件導入特殊命名空間CORE::GLOBAL::來實現的。

然後給出幾個例子。在端部,但是,是

最後,一些內置插件(例如existsgrep)不能被重寫。

什麼是完整列表?

+0

我很高興你問這個,因爲我正要問自己,因爲我必須爲這本書寫作。 :) – 2010-09-09 19:48:00

+0

@brian d foy我會把你的賬單寄給你。 – 2010-09-09 19:49:01

+0

我會在啤酒券在一些Perl的事件贖回支付。 :)我正試圖通過暴力來做到這一點,只是看看Perl的抱怨。我仍然可以這樣做。 – 2010-09-09 20:00:46

回答

14

任何值,該值是在toke.c負可以被覆蓋;所有其他人可能不會。您可以查看源代碼here

例如,讓我們來看看waitpid上線10396:

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

OP中的鏈接包含一個模擬'glob'的特定示例。 – mob 2010-09-09 17:48:53

+3

該例通過將'glob'符號導出到調用包來實現,而不是替換'CORE :: GLOBAL ::'中的符號。 – friedo 2010-09-09 18:06:30

+0

必須有一些額外的魔術:'chop'和'splice'可以被模擬。我認爲'shift','unshift','push'和'pop'也可以。 – mob 2010-09-09 18:11:28

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"; 
} 
+3

還有一些額外的魔法允許覆蓋'do','require'和'glob'。請參閱'perlsub'瞭解(如果不是如何以及爲什麼)。 – mob 2010-09-09 18:03:18