web-dev-qa-db-ja.com

Perlで2つの配列をハッシュに割り当てるにはどうすればよいですか?

ハッシュで接続したい2つの大きな配列(ハッシュに書き込むことはできません)を含むコード行があります。

例えば、 $array1[0]がキーになり、$array2[0]は値になり、以下同様に$array1[150]$array2[150]

私がこれをどのように行うかについてのアイデアはありますか?

32
Jane

あなたは単一の割り当てでそれを行うことができます:

my %hash;
@hash{@array1} = @array2;

これは一般的なイディオムです。から スライス上のperldoc perldata

ハッシュスライスで「%」の代わりに「@」を使用する理由について混乱している場合は、次のように考えてください。角かっこのタイプ(正方形または中括弧)は、それが配列であるかハッシュであるかを決定します。一方、配列またはハッシュの先頭の記号( '$'または '@')は、単数形(スカラー)または複数形(リスト)のどちらを返すかを示します。

これらの1つを見ると、ジッパーのイメージが表示されます...

65
martin clayton

マーティン・クレイトンには あなたの一般的な質問に対する最良の答え があります。Perl5.12には興味深い新機能もあります。 それぞれが配列上にある を使用できるため、並列配列を簡単に反復できます。使用する前に値を操作する場合に便利です。

 while( my( $index, $value ) = each @array1 ) {
      ...; # maybe do something to $value
      $hash{ $value } = $array2[$index];
      }
16
brian d foy
use List::MoreUtils qw( Zip );

my @a = 'A' .. 'E';

my @b = 1 .. 5;

my %hash = Zip @a, @b;
4
Felix

(これをブライアンの回答へのコメントとして投稿しようとしましたが、フォーマットを正しく取得できませんでした。)

eachのネストされた使用を避けるように注意する必要があります。 eachは、配列の「グローバル」イテレータで機能します。最後に達すると、falseを返し、位置を最初にリセットします。したがって、次のコードは無限ループになります。

彼の YAPC :: NAでの講演 についてRJBSに感謝します。そこで彼は組み込みイテレータのグローバルな性質を指摘しました。

use strict;
use warnings;

my @array = 'A' .. 'J' ;

while ( my ($index, $value) = each @array){
        print "printing ($index, $value) from outer loop\n";

        while ( my ($index_in, $value_in) = each @array){
                print "printing ($index_in, $value_in) from inner loop\n";
        }
}
3