我有一些代码感觉像是 Perl 中的错误,但我是否遗漏了一些东西? 基本上,当我在共享哈希中本地化哈希元素时,该元素在离开范围后仍然存在(具有
undef
值)。
例如:
use threads;
use threads::shared;
my $hash1 = {};
{ local $hash1->{'desc'} = "blah" }
print exists($hash1->{'desc'}) ? "Hash: exists\n" : "Hash: does not exist\n";
my $hash2 = shared_clone({});
{ local $hash2->{'desc'} = "blah" }
print exists($hash2->{'desc'}) ? "Shared hash: exists\n" : "Shared hash: does not exist\n";
print "Shared hash: is undef\n" if !defined($hash2->{'desc'});
对于 perl v5.34.0 打印以下内容:
Hash: does not exist
Shared hash: exists
Shared hash: is undef
我发现了一个非常类似的错误,显然在 Perl v5.8.0 中修复了绑定哈希。 我想知道共享哈希是否与“绑定”不同,因此仍然存在错误?
perldoc perl58delta
中确定的错误已修复:
本地化的哈希元素(和%ENV)正确地未本地化,不会 存在,如果它们在本地化之前不存在的话。
use Tie::Hash; tie my %tied_hash => 'Tie::StdHash'; ... # Nothing has set the FOO element so far { local $tied_hash{FOO} = 'Bar' } # This used to print, but not now. print "exists!\n" if exists $tied_hash{FOO};
作为此修复的副作用,绑定哈希接口必须定义 EXISTS 和 DELETE 方法。
您应该从两个哈希中获得相同的行为,所以这是一个错误。 举报。