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 <[email protected]> 于 2007 年提供。