【问题标题】:Looping through hash of arrays in Perl在 Perl 中循环遍历数组的哈希
【发布时间】:2013-02-09 04:55:58
【问题描述】:

我有一个数组哈希,如下:

my %hash = (
234 => ["Larry", "Curly", "Moe"],
235 => ["bb", "ab", "aa", "ab", "bb"],
236 => ["aa", "ab", "bb", "aa", "bb"],
)

对于我的哈希中的每个键,我想遍历数组的每个元素,将其分配给一个标量变量,以便我可以处理它,然后移动到数组的下一个元素。一旦我为一个键处理了数组的所有元素,我想进入下一个键并单独处理其数组的所有元素,依此类推。

我找到并修改了一个迭代哈希值的代码(在本例中是每个键的数组)。然后我有一个嵌套的 for 循环,它遍历该数组的每个元素。但是,它并没有达到我的预期。

for my $value (values %hash) {
    for (@$value) {
        my $index = shift($_);
       #process index
    }
}

错误信息 不是 [行号] 处的 ARRAY 引用

例如,对于第一次迭代,我希望 $index 等于 Larry 以便我可以处理它。下一次迭代,我希望 $index 等于 Curly 以便我可以处理它。下一次迭代,$index 应该等于 Moe,处理它。下一次迭代,$index 应该等于 bb,以此类推。

可能有比shift 更好的功能。 shift 函数从数组中取出第一个元素。我希望数组的哈希值保留它的值,这样我就不必重新填充数组的哈希值。

谢谢

【问题讨论】:

    标签: arrays perl hash reference dereference


    【解决方案1】:

    问题是您在@$value 中的列表已经是您的数组元素列表,而不是数组。这就是为什么你不能在上面使用shift。您只需要:

    for my $value (values %hash) {
        for my $index (@$value) {  # "Larry", "Curly", "Moe" etc
           ....
           #process index
        }
    }
    

    你可能不想在你的数组上使用shift,因为这会从你的原始结构中删除条目。

    【讨论】:

      【解决方案2】:

      如果你想遍历数组的散列,你可以这样做

      #!/usrbin/perl -w
      use strict;
      use warnings;
      use Data::Dumper;
      
      
      my %hash = (
      234 => ["Larry", "Curly", "Moe"],
      235 => ["bb", "ab", "aa", "ab", "bb"],
      236 => ["aa", "ab", "bb", "aa", "bb"],
      );
      
      foreach (keys %hash){
          foreach my $array(@{$hash{$_}}){
              ##do something with $array;
          }
      }
      

      这里 $array 将为特定键一次保存一个数组值。

      谢谢

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-20
        • 1970-01-01
        • 1970-01-01
        • 2016-01-27
        • 2012-08-22
        • 1970-01-01
        • 2012-07-27
        • 2019-01-13
        相关资源
        最近更新 更多