内容

名称

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__andcmpdefaultdodumpelseelsifeqevalforforeachformatgegivengotogrepgtiflastlelocalltmmapmynenextnoorourpackageprintprintfqqqqrqwqxredorequirereturnssaysortstatesubtrunlessuntilusewhenwhilexxory

对于以下函数,使用和号语法和通过引用调用不起作用,因为它们具有无法始终转换为简单列表的特殊语法(例如,eofeof()

chdirchompchopdefineddeleteeofexecexistslstatsplitstatsystemtruncateunlink

覆盖核心函数

若要使用自己的版本覆盖 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 <[email protected]> 于 2007 年提供。

另请参见

perlsubperlfunc