如何在Perl中迭代数组的哈希?

时间:2012-08-02 17:45:34

标签: arrays perl hash iteration

我有以下结构(实际上,它更大):

$param_hash = {
          'param1' => [0, 1],
          'param2' => [0, 1, 2],
          'param3' => 0,
        };

我想在行中打印不同参数的所有可能组合,如下所示:

param1='0' param2='0' param3='0'
param1='0' param2='1' param3='0'
param1='0' param2='2' param3='0'
...

我知道需要迭代(比如this one),但我无法让它工作。我该怎么做? 或者我可能只是应该使用另一种结构来存储参数值范围?

3 个答案:

答案 0 :(得分:1)

首先你必须在散列键中找到最长的数组引用,像这样的迭代

for my $value (0..$maxValue) {
    foreach my $key (sort keys %$param_hash) {

        unless (ref($param_hash->{$key}) eq 'ARRAY') {
            $param_hash->{$key} = [$param_hash->{$key}];
        }

        print "$key=", $#{$param_hash->{$key}} >= $value ? $param_hash->{$key}->[$value] : 0;
        print ' ';
    }
    print "\n";
}

其中maxValue是最长的数组引用,在本例中为2.这将按照您在问题中描述的方式对其进行格式化。

答案 1 :(得分:1)

foreach my $key (keys %$param_hash){
    if(ref $param_hash->{$key} eq 'ARRAY'){
        foreach my $value (@{$param_hash->{$key}}){
            print "$key = $ value ";
        }
    }
        else {
            print "$key = $param_hash->{$key} ";
        }
    print "\n"
    }

答案 2 :(得分:1)

此解决方案假设参数排序无关紧要,只要涵盖所有情况。我认为如果对你的问题很重要,CPAN会有一些有序的散列。

use strict;

my %KNOBS = (ARG1=>[1,2,3],
             ARG2=>['a','b'],
             ARG3=>['41:R']);

my %indicies;
foreach my $keys (keys %KNOBS)
{
  $indicies{$keys}=0;
}

my @orderedkeys = (keys %KNOBS);

printknobs();
while(incrimentindicies())
{
  printknobs();
}

sub printknobs
{
  foreach (@orderedkeys)
  {
    print "-$_ $KNOBS{$_}[$indicies{$_}] "; #num elements in array $key of %knob
  }
  print "\n";
}

sub incrimentindicies
{
  foreach (@orderedkeys)
  {
    if( $indicies{$_} + 1 < @{$KNOBS{$_}})
    {
      $indicies{$_} = $indicies{$_} + 1;
      return 1;
    }else{
      $indicies{$_} = 0;
    }
  }
  return 0;
}

输出:

-ARG2 a -ARG3 41:R -ARG1 1
-ARG2 b -ARG3 41:R -ARG1 1
-ARG2 a -ARG3 41:R -ARG1 2
-ARG2 b -ARG3 41:R -ARG1 2
-ARG2 a -ARG3 41:R -ARG1 3
-ARG2 b -ARG3 41:R -ARG1 3

@orderedkeys确保调用%indiciesincrimentindicies排序的变化无关紧要。