gpt4 book ai didi

perl - 在 Perl 中从符号表中删除名称后访问包变量?

转载 作者:行者123 更新时间:2023-12-02 00:37:01 24 4
gpt4 key购买 nike

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

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

最佳答案

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

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

这段代码最终得到两个 *n 的 glob;在删除执行之前编译的所有代码都将引用原始代码;之后编译的所有代码都将引用新代码(符号引用将获取运行时该点符号表中的任何一个)。

$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;

关于perl - 在 Perl 中从符号表中删除名称后访问包变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28207946/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com