我有一套水桶,还有一套清除装置'可能包含比我感兴趣的集合更多/更少的桶 - 我试图用散列片从桶中减去删除值,如下所示:
@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
};
答案 0 :(得分:3)
此处没有特定于哈希切片运算符的任何内容,只是-=
运算符不会在列表上分发。
由于同样的原因,这也不起作用:
($a,$b) = (10,20);
($a,$b) -= (1,1);
print "$a $b\n";
明确编写循环以获得所需内容:
$buckets{$_} -= $remove{$_} for keys %buckets;