内容

名称

Symbol - 操作 Perl 符号及其名称

概要

use Symbol;

$sym = gensym;
open($sym, '<', "filename");
$_ = <$sym>;
# etc.

ungensym $sym;      # no effect

# replace *FOO{IO} handle but not $FOO, %FOO, etc.
*FOO = geniosym;

print qualify("x"), "\n";              # "main::x"
print qualify("x", "FOO"), "\n";       # "FOO::x"
print qualify("BAR::x"), "\n";         # "BAR::x"
print qualify("BAR::x", "FOO"), "\n";  # "BAR::x"
print qualify("STDOUT", "FOO"), "\n";  # "main::STDOUT" (global)
print qualify(\*x), "\n";              # returns \*x
print qualify(\*x, "FOO"), "\n";       # returns \*x

use strict refs;
print { qualify_to_ref $fh } "foo!\n";
$ref = qualify_to_ref $name, $pkg;

use Symbol qw(delete_package);
delete_package('Foo::Bar');
print "deleted\n" unless exists $Foo::{'Bar::'};

描述

Symbol::gensym 创建一个匿名全局变量并返回对它的引用。这样的全局变量引用可以作为文件或目录句柄使用。

为了与不支持匿名全局变量的旧实现保持向后兼容性,还提供了 Symbol::ungensym。但它什么也不做。

Symbol::geniosym 创建一个匿名 IO 句柄。这可以分配到现有的全局变量中,而不会影响全局变量的非 IO 部分。

Symbol::qualify 将非限定符号名称转换为限定变量名称(例如 "myvar" -> "MyPackage::myvar")。如果它被赋予第二个参数,qualify 将使用它作为默认包;否则,它将使用调用者的包。无论如何,全局变量名称(例如 "STDOUT"、"ENV"、"SIG")始终用 "main::" 限定。

限定只适用于符号名称(字符串)。引用在假设它们是全局变量引用(它们本质上是限定的)的情况下保持不变。

Symbol::qualify_to_refSymbol::qualify 相同,只是它返回一个全局变量引用而不是符号名称,因此即使 use strict 'refs' 生效,您也可以使用结果。

Symbol::delete_package 会清除整个包命名空间。请注意,此例程默认情况下不会导出,您可能需要显式导入它。

错误

Symbol::delete_package 功能过于强大。它会取消定义指定包中的所有符号。由于性能原因,Perl 在每次调用函数或访问全局变量时不会执行符号表查找,因此,即使您在之后重新加载 Foo 模块,已经加载并使用 Foo 包中符号的某些代码也可能在您删除 Foo 后停止工作。