1

私はPerlに少し慣れていませんが、このバグは2、3日間私を困惑させました。この特定の問題について、Googleで何かを見つけるのに苦労しました。「手がかり」をできるだけ明確に提示するように努めます。Perlv5.16.1を使用しています。私のコードの関連する行は次のとおりです。

my %result = ();

...

$result{'TABLENAME'} = $tableName;

...

for my $i (1..$numberOfColumns) {
    $result{$columnNames[$i-1]} = $columnValues[$i-1];
}

私のテストでは、$numberOfColumnsは7です。問題は、forループが期待どおりにキーと値のペアを作成しないことです。説明します。Perlのデバッガーを使用してデバッグを試みましたperl -d。以下のデバッガー出力は、最後の行まで正常に動作していることを示しています。

  DB<2> c 219
testcode::testsub(modules/testcode.pm:219):
219:        $result{'TABLENAME'} = $tableName;

  DB<3> c 239
testcode::testsub(modules/testcode.pm:239):
239:        for my $i (1..$numberOfColumns) {

  DB<4> p %result
TABLENAMEmyowntableitis

  DB<5> p $result{TABLENAME}
myowntableitis

  DB<6> s
testcode::testsub(modules/testcode.pm:240):
240:            $result{$columnNames[$i-1]} = $columnValues[$i-1];

  DB<6> p $i
1

  DB<7> p $columnNames[0]
id

  DB<8> p $columnValues[0]
1

  DB<9> s
testcode::testsub(modules/testcode.pm:240):
240:            $result{$columnNames[$i-1]} = $columnValues[$i-1];

  DB<9> p $i
2

  DB<10> p %result
TABLENAMEmyowntableitisid
1

  DB<11> p $result{TABLENAME}
    myowntableitis

  DB<12> p $result{id}

  DB<13>

p $result{id}私は最後が何もないのではなく1を返すことを期待していました。誰かがここで何が起こっているのか考えていますか?

4

3 に答える 3

5

を見ると、次の行にが印刷されていることがDB<10>わかります。1

DB<10> p %result
TABLENAMEmyowntableitisid
1

これは$result{"id\n"} eq "1"、、および未定義のキーを使用していることを意味します。

スタイルノート:foreachもちろん、ハッシュを構築するために2つ以上の配列を使用することは可能です。しかし、繰り返しになりますが、Perlにはスライスがあり、これにより作業がはるかに簡単になります(信じられないほど大量のデータを処理している場合を除く)

@result{@columnNames} = @columnValues;

(仮定@columnNames <= @columnValues

于 2012-09-17T21:20:21.350 に答える
2

問題は、だけでなくにcolumnnames[0]設定されていることです。IDの後の改行に注意してください。あなたはファイルからこれらを読んでいて、改行を削除していなかったと思います。同じことが値にも当てはまります。ループに追加します。"id\n"id

chomp $columnNames[$i-1];
chomp $columnValues[$i-1];

そしてそれはあなたの問題を解決するはずです。または、ファイルから値を読み取るときに値を切り刻むこともできます。

ちなみに、ループカウンターをインデックス自体にするのが通例です。0これは、 to$numberOfColumns - 1または(さらには)へのループ$#columnNamesです。

于 2012-09-17T21:15:19.730 に答える
1

$result{id}空の場合、何が$result{"id\n"}返されますか?あなたは線を切り刻んでいないかもしれません。

于 2012-09-17T21:15:30.790 に答える