共享哈希和本地化哈希元素是否存在错误?

问题描述 投票:0回答:1

我有一些代码感觉像是 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 方法。

perl shared perl-hash
1个回答
0
投票

您应该从两个哈希中获得相同的行为,所以这是一个错误。 举报

© www.soinside.com 2019 - 2024. All rights reserved.