从Perl中的符号表中删除其名称后访问包变量?

时间:2015-01-29 06:03:33

标签: perl

我尝试从main::符号表中删除包变量的名称,如下所示,但似乎后来的代码仍然可以引用该变量,为什么删除后可以引用它?从符号表中删除名称会产生什么影响?

$n = 10;
delete $main::{'n'};
print $n;

1 个答案:

答案 0 :(得分:5)

编译perl代码时,会查找(并根据需要创建)包变量/符号的globs,并直接从编译的代码中引用。

因此,如果删除符号表条目$pkg::{n},则使用$pkg::n@pkg::n等的所有已编译代码仍使用原始glob。但do / require' d代码或eval STRING或符号引用赢了。

此代码以两个* n个全局结束;删除执行前编译的所有代码都将引用原始代码;之后编译的所有代码都将引用新的代码(符号引用将在运行时的该点获取符号表中的任何一个)。

$n = 123;
delete $::{n};
eval '$n=456';
print $n;
eval 'print $n';

另一个例子:

$n = 123;
sub get_n { $n }
BEGIN { delete $::{n} }
$n = 456;
print get_n();
print $n;