2013-02-01 42 views
0

誰能告訴我我哪裏錯了?我無法弄清楚...... 基本上,我的代碼試圖做的是讀取文件併爲每個文件創建一個哈希,這些哈希被組織到哈希上。用戶可以輸入兩個參數,一個是外部散列鍵,另一個是內部散列鍵。 我輸入的是城市和PIT;與我在寫入行之前寫入的參數相同...我的散列碼散列有什麼問題?

我嘗試過數千次,我不斷收到此錯誤:無法使用未定義的值作爲HASH參考我已評論該行在代碼中。 這兩個文件是cities.txt; school.txt。 它們的內容都只是如下: PIT \ tPittsburgh NY \ tNewYork

#!/bin/perl -w 
use strict; 
use Data::Dumper; 
our %hash_all =(); 
sub readHash{ 
    my @vars = @_; 
    my $filename = $vars[0]; 
    my %iptable =(); 
    if(open(IN,$filename.".txt")) { 
      while(<IN>) { 
      my @tmp = split(/\t/); 
      $iptable{$tmp[0]} = $tmp[1]; 
     } 
    } 
    return %iptable; 
} 

sub loadAll{ 
     my %school = readHash("school"); 
    my %city = readHash("cities"); 
    $hash_all{school} = \%school; 
    $hash_all{city} = \%city; 
    print Dumper(\%hash_all); 
} 

sub queryValue{ 
    my @pars = @_; 
    my $key1 = $pars[0]; 
    my $key2 = $pars[1]; 

    print "key1".$key1; 
    print "key2".$key2; 
    print Dumper(\%hash_all); 
    my %temp = %{$hash_all{"city"}};#THIS LINE WORKS 
    print $temp{"PIT"}; #THIS LINE WORKS 
    my %temp2 = %{$hash_all{$key1}};#THIS LINE HAS AN ERROR 
    print $temp2{$key2}; 
} 

loadAll(); 
my $par1 = <>; 
my $par2 = <>; 
queryValue($par1,$par2); 
+0

錯誤是告訴你'$ key1'是未定義的。如果你做了一些反向追蹤,你可以看到'$ key1'來自'queryValue'的第一個參數,它是'$ par1'。這是你輸入的第一行,所以我懷疑你如何輸入你的程序輸入有問題。您可以與我們分享您的腳本執行代碼以及您的輸入文件嗎? – MattLBeck

+1

@Mottrition:這不是錯誤消息所說的,因爲'$ key1'沒有被用作散列引用。問題在於'$ hash_all {$ key1}'是未定義的,所以'$ key1'的值很可能與'%hash_all'中的任何鍵不一致。 – Borodin

+0

@Borodin Doh,我的錯! – MattLBeck

回答

4

你的問題可能是,當你在$par1$par2閱讀,他們在結尾換行。所以你最終尋找一個像"city\n"這樣的散列鍵,它與"city"不一樣。

確保在輸入參數上使用chomp,如chomp($par1)。這應該照顧它。