我尝试从main::
符号表中删除包变量的名称,如下所示,但似乎后来的代码仍然可以引用该变量,为什么删除后可以引用它?从符号表中删除名称会产生什么影响?
$n = 10;
delete $main::{'n'};
print $n;
答案 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;