0

我有以下结构(实际上,它要大得多):

$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'
...

我知道需要一个迭代(比如这个),但我就是无法让它工作。我该怎么做?
或者也许我应该使用另一个结构来存储参数值范围?

4

3 回答 3

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确保%indicies在调用incrimentindicies.

于 2014-02-27T17:26:36.600 回答
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。这将按照您在问题中描述的方式对其进行格式化。

于 2012-08-02T18:04:20.917 回答
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"
    }
于 2012-08-02T18:15:28.353 回答