【问题标题】:How do I determine the amount of times I append something to a nested hash?如何确定将某些内容附加到嵌套哈希的次数?
【发布时间】:2011-06-20 09:20:29
【问题描述】:

我认为,我正在处理一个需要我求助于某种类型的 OOP 的数据集。我对此没有太多经验。基本上,我在 foreach 循环中解析数据,并将结果添加到哈希中。

至少目前只有大约 8 个不同的值,但是这些值有多个“命中”。假设我创建了值color=>white。好吧,color=>white 会再次出现,当我将它附加到哈希时,它只会覆盖现有的 color=>white

我希望确定我附加color=>white 的次数。现在,显然有一种简单而愚蠢的方法可以做到这一点——某种开关,测试各种条件。只有事物是动态的。事情偶尔会发生变化。所以我需要能够在不不断更改脚本的情况下处理它。

因此,理想情况下,我最终能够检查每个键/值的哈希值并查看它发生了多少次,而不知道我在寻找哪个键/值。

这里有人有什么建议吗?

【问题讨论】:

    标签: perl oop loops hash


    【解决方案1】:

    您可以使用多级散列,其中第一级是属性名称,下一级是值,其值是计数。

    my @data = qw(
        color white
        color blue
        color white
        size  10
        size  20
        size  10
        color yellow
        color blue
        color white
    );
    
    my %hash;
    while (@data) {
        my ($key, $value) = splice @data, 0, 2;
        $hash{$key}{$value}++;
    }
    
    for my $key (keys %hash) {
        for my $value (keys %{$hash{$key}}) {
            print "'$key' was '$value' $hash{$key}{$value} times\n"
        }
    }
    

    哪个打印:

    'color' 是 'white' 3 次 'color' 是 'blue' 2 次 “颜色”是“黄色”1 次 'size' 是 '10' 2 次 'size' 是 '20' 1 次

    【讨论】:

    • 是的。 perldsc 有一些其他示例,并且还有很多其他关于相关主题的 perldoc。 (更不用说每一本优秀的 Perl 书籍都应该涵盖这个主题。)
    • 太棒了!太感谢了。完美运行。
    【解决方案2】:

    Perl 有这种使用单个散列来模拟多级关联数组的方法。它继承自 AWK,古老而有缺陷,你不应该使用它……但无论如何它有点有趣。

    my %hash;
    
    while (<DATA>) {
        my ($key, @values) = split;
        $hash{$key, $_}++ for @values;
    }
    
    while (my ($keys, $count) = each %hash) {
        my ($key, $value) = split /\Q$;/, $keys;
        print "$key => $value => $count\n";
    }
    
    __DATA__
    color white blue red green
    size small medium
    color red orange purple
    size medium large
    

    产生类似的东西

    颜色 => 蓝色 => 1 颜色 => 绿色 => 1 颜色 => 橙色 => 1 颜色 => 紫色 => 1 颜色 => 红色 => 2 颜色 => 白色 => 1 大小 => 大 => 1 尺寸 => 中号 => 2 大小 => 小 => 1

    虽然哈希顺序是不可预测的。

    请参阅 Eric Strom 的回答(并阅读 perldoc perllolperldoc perldsc)了解现代和更好的解决方案。

    【讨论】:

      猜你喜欢
      • 2010-09-25
      • 2018-01-28
      • 1970-01-01
      • 2019-06-27
      • 1970-01-01
      • 2018-04-21
      相关资源
      最近更新 更多