1

forループを離れるとすぐに、多次元配列のハッシュ内のいくつかの変数が消えます。変数はループ内で 1 つずつ正しく出力されますが、ループの外でアイテムを出力すると、最初のアイテムを除いて常に空になります。

for my $y (0..$last_row - 2) {
    my $mlid = $Sheet->Cells($y+2, 1)->{'Value'}; 
    my @a = ();
    $a[0] = $Sheet->Cells($y+2, 3)->{'Value'}; 
    $a[1] = $Sheet->Cells($y+2, 4)->{'Value'}; 
    $a[2] = $Sheet->Cells($y+2, 6)->{'Value'}; 
    $a[3] = $Sheet->Cells($y+2, 7)->{'Value'}; 
    $a[4] = $Sheet->Cells($y+2, 8)->{'Value'}; 
    push @{$longHash{$mlid}}, [ @a ];
    print "Item in Array in Hash: $longHash{$mlid}[1][0]\n"; #this prints nothing

    if (exists $numPeople{$mlid}){
        $numPeople{$mlid}++;
    }else{
        $numPeople{$mlid} = 0;
        $numPeople{$mlid}++;
    }
}

print "Item in Array in Hash: $longHash{7202}[0][0]\n"; #this prints properly
print "Item in Array in Hash: $longHash{7202}[1][0]\n"; #this prints nothing

動作は次のようにする必要があります:

私はハッシュを持っています。単一の mlid のキーは、(人を表す) 配列を提供します。各配列には、私が読んでいる Excel ファイルから 0 ~ 4 のインデックスが定義されている別の配列が必要です。

したがって、mlid 7202、7 人目、および Excel の 4 列目からデータを取得するには、$longHash{7202}[7][1] を配置する必要があります (4 列目を配列。)

4

2 に答える 2

4

$longHash{$mlid}ループの反復ごとに上書きしているため、最良の場合$longHash{7202}[$x]、 は の 1 つの値に対してのみ定義されます$x

ここで示したものよりもはるかに複雑なことをしていない限り、クリアする必要はまったくないと思います$longHash{$mlid}。言って

$longHash{key}[index] = expression

事前初期化を必要とせずに$longHash{key}両方を自動有効化します。$longhash{key}[index]

( $longHash{$mlid} = ()これも少し奇妙に見えます。空のリストをスカラー変数に代入しています。 と言うのと何ら変わりはないと思います$longHash{$mlid}=0。空の配列参照に設定するつもりなら、[]代わりに を使用する必要があります())。

于 2011-02-22T20:23:43.470 に答える
2

2 つの問題があります。

  1. $longHash{$mlid} = ()

スカラー フィールドをリストに設定しようとしています。{$mlid}` は、リストではなくリストrefに設定する必要があります。最も簡単な修正は です$longHash{$mlid} = []が、実際の問題は修正されません。

2. $longHash{$mlid}[$y] = [ @a ];と組み合わせて$longHash{$mlid} = ();

ループを通過するたびにクリア$longHash{$mlid}してから、ゼロ以外のインデックスに割り当てようとしています。おそらく、ここで必要なのは、リストのハッシュではなく、ハッシュのハッシュです。

アップデート

あなたの新しいバージョンでは、私は思う

push @{$longHash{$mlid}}, [ @a ];

ただあるべき

$longHash{$mlid} = [ @a ];

更新 2

私はあなたのコードが今働いているはずだと思います。

以下の単純化された例と同等のようです。

my %hash;

my @a;
$a[0] = "Fred";
$a[1] = 31;
$a[2] = "Melbourne";

push @{$hash{7202}}, [ @a ];

$a[0] = "Mary";
$a[1] = 25;
$a[2] = "Sydney";

push @{$hash{7202}}, [ @a ];

print $hash{7202}[0][0] . "\n";
print $hash{7202}[1][0] . "\n";

更新 3

追加してください

use warnings;
use strict;

存在すると思われるすべての配列インデックスが存在することを確認します。

そして、データを繰り返し処理して印刷してみてください。

for my $mlid (keys %hash) {
    my $recordref = $hash{$mlid};
    my @record = @$recordref;
    for my $i (0..scalar(@record)-1) {
        printf "mlid %s person %d name %s\n", $mlid, $i, $record[$i][0];
    }
}
于 2011-02-22T20:25:29.630 に答える