修改散列片会产生不一致的行为

时间:2014-07-16 17:49:11

标签: perl hashtable slice

我有一套水桶,还有一套清除装置'可能包含比我感兴趣的集合更多/更少的桶 - 我试图用散列片从桶中减去删除值,如下所示:

@buckets{keys %buckets} -= @remove{keys %buckets};

但是,似乎只有散列的LAST元素才会被修改 - 这显然是不一致的,具体取决于返回散列键的运行时顺序。

这不是使用哈希切片的有效方法吗?

完整代码:

use strict;
use warnings;
use Data::Dumper;

my %buckets = ( 
    a => 100,
    b => 200,
    c => 300,
    d => 400,
    );

my %remove = (
    a => 1,
    b => 2,
    c => 3,
    d => 4,
    ); 

my %before = %buckets;

@buckets{keys %buckets} -= @remove{keys %buckets};

# my @keys = keys %buckets;
# @buckets{@keys} -= @remove{@keys};  # Gives same behavior

warn Data::Dumper->Dump([ \%buckets ], ['buckets_after']);

示例输出:

% perl perltest.pl
$buckets_after = {
                   'd' => 400,
                   'c' => 300,
                   'a' => 100,
                   'b' => 198
                 };
% perl perltest.pl
$buckets_after = {
                   'c' => 300,
                   'd' => 400,
                   'b' => 200,
                   'a' => 99
                 };
% perl perltest.pl
$buckets_after = {
                   'a' => 100,
                   'd' => 400,
                   'b' => 200,
                   'c' => 297
                 };

1 个答案:

答案 0 :(得分:3)

此处没有特定于哈希切片运算符的任何内容,只是-=运算符不会在列表上分发。

由于同样的原因,这也不起作用:

($a,$b) = (10,20);
($a,$b) -= (1,1);
print "$a $b\n";

明确编写循环以获得所需内容:

$buckets{$_} -= $remove{$_} for keys %buckets;
相关问题