用Perl 5.24在OS X测试限制哈希更新不是原子仅与`lock_keys`不`lock_hash`
我试图找出原因试图更新受限散列清除哈希表(违反原子)只有当散列的键受到限制时。如果lock_hash
已应用于散列,则非法修改将完全回滚。
Hash::Util
的文档部分声明。
CAVEATS
注意,受限制的操作的捕获不 原子:例如
的eval {%散列=(illegal_key => 1)}
离开%散列空的而不是其原始内容。
我本来想看到像更新单个非法钥匙单独的操作是否是原子和Perl中是否会5.24发射在这种情况下发出警告,但是当我第一次尝试我无法重现行为。
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
use Hash::Util qw[lock_hash lock_keys];
use Data::Dumper;
my %hash = (a => 1, b => 2);
lock_hash(%hash);
eval { %hash = (illegal_key => 1) };
print Dumper \%hash;
这将打印
$VAR1 = {
'a' => 1,
'b' => 2
};
使用,lock_keys
,但是,确实重现行为
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
use Hash::Util qw[lock_hash lock_keys];
use Data::Dumper;
my %hash = (a => 1, b => 2);
lock_keys(%hash);
eval { %hash = (illegal_key => 1) };
print Dumper \%hash;
打印一个空hashref,如文档预言
$VAR1 = {};
根据散列限制的方式,为什么行为有所不同?
您的声音听起来像是您确定它与Perl版本相关。该行为来自模块Hash :: Util。首先阅读它的代码。这可能与Perl的内部相关,但我怀疑5.24中的某些内容在这方面有所改变。 – simbabque
@simbabque我不确定它与Perl版本有关,但我没有在其他Perl版本或其他平台上测试代码片段。我不确定传达这些信息的正确方法。 –
你刚刚做到了。 :-)第二次你说5.24暗示你确定。我会稍微测试一下不同的版本,现在我正在打电话。看看http://perlbrew.pl安装多个不同的Perls,如果你想尝试自己。 – simbabque