0

我有一个散列的散列设置如下:

$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 方法?谢谢!

4

2 回答 2

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由于原型设计需要实际的数组(并且数组引用不会这样做)。幸运的是,您可以通过强制旧式调用并传入数组 refs 来绕过它:

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 :-(
于 2012-07-10T17:34:42.910 回答
2

List::Gentuples函数也可以做到这一点:

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

say "@$_" for @tuple;  # 1 4 7
                       # 2 5 8
                       # 3 6 9
于 2012-07-10T18:31:56.880 回答