3

次のように、配列のハッシュがあります。

my %hash = (
234 => ["Larry", "Curly", "Moe"],
235 => ["bb", "ab", "aa", "ab", "bb"],
236 => ["aa", "ab", "bb", "aa", "bb"],
)

ハッシュの各キーについて、配列の各要素をループ処理し、それをスカラー変数に割り当てて処理できるようにしてから、配列の次の要素に移動したいと考えています。キーの配列のすべての要素を処理したら、次のキーに進み、その配列のすべての要素を個別に処理します。

ハッシュ値 (この場合は各キーの配列) を反復処理するコード スニペットを見つけて変更しました。次に、その配列の各要素を反復処理するネストされた for ループがあります。しかし、それは私が期待することをしていません。

for my $value (values %hash) {
    for (@$value) {
        my $index = shift($_);
       #process index
    }
}

エラー メッセージ Not an ARRAY reference at [行番号]

たとえば、最初の反復では、それを処理できるよう$indexに等しくしたいと考えてLarryいます。次の反復では、処理できるよう$indexに等しくしたいと考えています。Curly次の反復は、$index等しいはずMoeです。それを処理します。次の反復は、$index等しいはずbbです。

よりも優れた機能があるかもしれませんshift。このshift関数は、配列から最初の要素を取り出します。配列のハッシュに値を保持して、配列のハッシュを再設定する必要がないようにしたい。

ありがとう

4

2 に答える 2

9

問題は、あなたのリスト@$valueがすでに配列ではなく配列要素のリストであることです。そのため、その上で使用することはできませんshift。あなたに必要なのは:

for my $value (values %hash) {
    for my $index (@$value) {  # "Larry", "Curly", "Moe" etc
       ....
       #process index
    }
}

shift元の構造からエントリが削除されるため、とにかく配列で使用したくないでしょう。

于 2013-02-23T17:38:32.247 に答える
1

配列のハッシュをループしたい場合は、次のようなことができます

#!/usrbin/perl -w
use strict;
use warnings;
use Data::Dumper;


my %hash = (
234 => ["Larry", "Curly", "Moe"],
235 => ["bb", "ab", "aa", "ab", "bb"],
236 => ["aa", "ab", "bb", "aa", "bb"],
);

foreach (keys %hash){
    foreach my $array(@{$hash{$_}}){
        ##do something with $array;
    }
}

ここで $array は、特定のキーの配列値を一度に 1 つずつ保持します。

ありがとう

于 2016-09-13T04:06:28.323 に答える