0

次のように設定されたハッシュのハッシュがあります。

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

2 番目のハッシュ ( に対応するもの$val2) の内部には、値のリストがあります。次のような 3 つのリストを作成できます。

$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、プロトタイピングのために実際の配列が必要になります (配列参照は必要ありません)。幸いなことに、古いスタイルの呼び出しを強制し、配列参照を渡すことで、これを回避できます。

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 に答える