CORE - Perl 核心例程的命名空间
BEGIN {
*CORE::GLOBAL::hex = sub { 1; };
}
print hex("0x50"),"\n"; # prints 1
print CORE::hex("0x50"),"\n"; # prints 80
CORE::say "yes"; # prints yes
BEGIN { *shove = \&CORE::push; }
shove @array, 1,2,3; # pushes on to @array
CORE 命名空间允许访问 Perl 的原始内置函数。CORE 包已内置到 Perl 中,因此在访问此命名空间中的例程之前,无需使用或请求一个假设的“CORE”模块。
可以在 perlfunc 中找到 Perl 中内置函数的列表。
对于所有 Perl 关键字,CORE:: 前缀将强制使用内置函数,即使它已被覆盖或通常需要 feature 编译指令。尽管有此表现,但这与 CORE 包无关,而是 Perl 语法的一部分。
对于很多 Perl 函数,CORE 包含真正的子例程。此功能在 Perl 5.16 中是新的。您可以引用这些函数并创建别名。但是,有些只能作为裸字调用;即,您不能使用和号语法 (&foo) 或通过引用调用它们。请参见上面的 shove 示例。这些子例程存在于所有关键字中,但以下关键字除外
__DATA__、__END__、and、cmp、default、do、dump、else、elsif、eq、eval、for、foreach、format、ge、given、goto、grep、gt、if、last、le、local、lt、m、map、my、ne、next、no、or、our、package、print、printf、q、qq、qr、qw、qx、redo、require、return、s、say、sort、state、sub、tr、unless、until、use、when、while、x、xor、y
对于以下函数,使用和号语法和通过引用调用不起作用,因为它们具有无法始终转换为简单列表的特殊语法(例如,eof 与 eof())
chdir、chomp、chop、defined、delete、eof、exec、exists、lstat、split、stat、system、truncate、unlink
若要使用自己的版本覆盖 Perl 内置例程,您需要在编译时导入它。这可以通过 subs 实用程序轻松实现。这只会影响您导入所述子例程的包
use subs 'chdir';
sub chdir { ... }
chdir $somewhere;
若要全局覆盖内置函数(即,在所有名称空间中),您需要在编译时将您的函数导入到 CORE::GLOBAL 伪名称空间
BEGIN {
*CORE::GLOBAL::hex = sub {
# ... your code here
};
}
每当在没有限定包的情况下调用内置函数时,都会调用新例程
print hex("0x50"),"\n"; # prints 1
在这两种情况下,如果您想访问原始的、未修改的例程,请使用 CORE:: 前缀
print CORE::hex("0x50"),"\n"; # prints 80
此文档由 Tels <nospam-abuse@bloodgate.com> 于 2007 年提供。