perl排序循环赛

时间:2012-07-10 17:27:31

标签: perl round-robin

我有一个像这样设置的散列哈希:

$hash->{$val}->{$val2}

第二个哈希(与$val2对应的哈希)内部是一个值列表。我可以有三个这样的列表:

$hash->{$val}->{1} = [1,2,3]
$hash->{$val}->{2} = [4,5,6]
$hash->{$val}->{3} = [7,8,9]

我希望将这些列表的值放入一个新的数组中,按$val2的循环顺序排序。因此结果如下:

@new_arr = (1,4,7,2,5,8,3,6,9)

有没有人知道perl中我能做到这一点的方法?谢谢!

2 个答案:

答案 0 :(得分:3)

如果您有CPAN访问权限,则可以安装List::MoreUtils并使用它:

use List::MoreUtils qw(zip);

my @new_arr = zip(@$hash->{$val}{1}, @$hash->{$val}{2}, @$hash->{$val}{3});

如果$hash->{$val}中的键/值对的数量是动态的,遗憾的是zip由于原型设计需要实际的数组(并且数组引用不会这样做)。幸运的是,你可以通过强制旧式调用并传入数组引用来解决它:

use List::MoreUtils qw(zip);

my @ordered_array_refs;
push @ordered_array_refs, $hash->{$val}{$_} for sort keys %{$hash->{$val}};
my @new_arr = &zip(@ordered_array_refs);     # nasty :-(

答案 1 :(得分:2)

List::Gentuples函数也可以执行此操作:

my @tuple = tuples [1..3], [4..6], [7..9];

say "@$_" for @tuple;  # 1 4 7
                       # 2 5 8
                       # 3 6 9