我有以下结构(实际上,它更大):
$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),但我无法让它工作。我该怎么做? 或者我可能只是应该使用另一种结构来存储参数值范围?
答案 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
确保调用%indicies
时incrimentindicies
排序的变化无关紧要。