【问题标题】:Modifying hash slice gives inconsistent behavior修改哈希切片会产生不一致的行为
【发布时间】:2014-07-16 17:49:11
【问题描述】:

我有一组存储桶和一组“删除”,可能包含比我感兴趣的集更多/更少的存储桶 - 我正在尝试从带有哈希切片的存储桶中减去删除值,就像这样:

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

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

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

完整代码:

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
                 };

【问题讨论】:

    标签: perl hashtable slice


    【解决方案1】:

    这里没有专门针对哈希切片运算符,只是 -= 运算符不会分布在列表中。

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

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

    明确地编写循环以获得你想要的:

    $buckets{$_} -= $remove{$_} for keys %buckets;
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-10
    • 1970-01-01
    • 2014-12-31
    • 2011-01-09
    • 2013-12-20
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多