的perlsub文檔的Overriding Built-in Functions部分提供這Perl的內置插件無法在CORE :: GLOBAL被重寫?
還有,當你想重寫有時是適用的第二種方法的內置無處不在,而不考慮命名空間的邊界。這是通過將一個子文件導入特殊命名空間
CORE::GLOBAL::
來實現的。
然後給出幾個例子。在端部,但是,是
最後,一些內置插件(例如
exists
或grep
)不能被重寫。
什麼是完整列表?
的perlsub文檔的Overriding Built-in Functions部分提供這Perl的內置插件無法在CORE :: GLOBAL被重寫?
還有,當你想重寫有時是適用的第二種方法的內置無處不在,而不考慮命名空間的邊界。這是通過將一個子文件導入特殊命名空間
CORE::GLOBAL::
來實現的。
然後給出幾個例子。在端部,但是,是
最後,一些內置插件(例如
exists
或grep
)不能被重寫。
什麼是完整列表?
任何值,該值是在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
有對SO感嘆mocking the filetest operators難度前面一個問題(-f
,-d
,-x
,...)
該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";
}
還有一些額外的魔法允許覆蓋'do','require'和'glob'。請參閱'perlsub'瞭解(如果不是如何以及爲什麼)。 – mob 2010-09-09 18:03:18
的readline(HANDLE)
功能(和等效<HANDLE>
I/O操作)可以被嘲笑,但它的汽車的行爲 - 指定爲$_
使用時像
while (<HANDLE>) { ... # equivalent to while (defined($_=readline(HANDLE)))
不能。請參閱hobbs在How can I still get automatic assignment to '$_' with a mocked 'readline' function?的評論。這意味着代碼如
while (<>) { # implicitly sets $_
do_something_with($_);
}
如果您重新定義readline
,可能會中斷。
我很高興你問這個,因爲我正要問自己,因爲我必須爲這本書寫作。 :) – 2010-09-09 19:48:00
@brian d foy我會把你的賬單寄給你。 – 2010-09-09 19:49:01
我會在啤酒券在一些Perl的事件贖回支付。 :)我正試圖通過暴力來做到這一點,只是看看Perl的抱怨。我仍然可以這樣做。 – 2010-09-09 20:00:46