2012-09-17 22 views
1

我對Perl有點新,而且這個錯誤讓我困惑了幾天。我很難在Google上找到任何具體問題。我會盡可能清楚地呈現「線索」。我正在使用Perl v5.16.1。在我的代碼中的相關行是這些:添加到Perl哈希產生令人費解的結果

my %result =(); 

... 

$result{'TABLENAME'} = $tableName; 

... 

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

在我的測試,$numberOfColumns爲7的問題是,for循環如我所料不創建鍵值對。我會解釋。我試過用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而不是沒有。有誰知道這裏會發生什麼?

+0

給我們,實際上產生的問題代碼! !或者至少,給出'use Data :: Djmper的輸出; {local $ Data :: Dumper :: Useqq = 1;打印(Dumper(\ @ columnNames,\ @columnValues)); }'。最佳猜測,'$ columnNames [0] ne「id」'。 – ikegami

回答

4

如果我們看一下DB<10>,我們看到1上印下一行:

DB<10> p %result 
TABLENAMEmyowntableitisid 
1 

這意味着$result{"id\n"} eq "1",和您使用的是未定義的關鍵。

風格說明:foreach當然,在兩個數組之間建立散列是可能的。但話又說回來,Perl有,這讓生活變得更輕鬆(除非你正在處理令人難以置信的大量數據)

@result{@columnNames} = @columnValues; 

(假設@columnNames <= @columnValues

+0

謝謝!有用的指針恰好是我錯過的線索,我還能要求什麼。 :)當我寫了兩個數組的foreach時,我有點覺得Perl必須有更聰明的東西來處理這個問題,但我沒有發現什麼。謝謝你讓我知道切片! – gsr

2

問題是columnnames[0]設置爲"id\n"而不僅僅是id。注意id後面的換行符。我想你是從文件中讀取這些文件,而不是刪除換行符。值也是如此。添加到您的循環:

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

並且應該解決您的問題。或者,當您從文件中讀取值時,您可以跺下這些值。

在附註中,習慣上將循環計數器作爲索引本身。這是從0$numberOfColumns - 1或(甚至到$#columnNames)的循環。

+0

謝謝!你是對的換行符! – gsr

1

如果$result{id}爲空,$result{"id\n"}會返回什麼?你可能不是chomp

+0

謝謝!這是現貨! – gsr