2013-04-18 78 views
1

我正在學習here的Perl腳本。 我有問題創建哈希。代碼在這裏:無法在Perl中創建哈希?

print "Hello World!\n"; 
@days = ("1", "2"); 
print "There are $#days days\n"; 
print "1 is $days[0]\n"; 
%months = ("a" => 1, "b" => 2, "c" => 3); 
print "There are $#months keys\n"; 
print "a is $months[0]\n"; 
for $i (keys %months) 
{ print "$i has value $months[$i].\n"} 

現在它的數組工作正常。 但是對於哈希它的打印「有-1個鍵」。 此外,它不打印任何內容在最後打印調用的變量值。

+0

請[使用開始提到的教程的更新版本](http://www.perl.com/pub/2008/04 /23/a-beginners-introduction-to-perl-510.html) - 你所提到的是2000年而不是[現代](http://www.onyxneon.com/books/modern_perl/index.html )根本! – Xaerxess

+0

@Xaerxess我覺得更好理​​解! :) –

+2

@Cool_Coder:*請*不要使用該版本的教程:它已近十三年的過時了!它是在Perl 5版本8的發佈之前編寫的,這是一個具有里程碑意義的版本,它改變了人們使用Perl的方式。版本10和版本14也是重要的更新。我們現在版本16,版本18的發佈即將開始!如果你繼續學習第6版,你將會學到許多不再相關的壞習慣,並且它不會幫助你理解現代Perl代碼。 – Borodin

回答

6

您正在使用散列上的數組語法,它不會完成您的想法。而不是在你的哈希上運行,你正在操作一個名爲@months的數組。例如:

print "There are $#months keys\n"; 

這將尋找陣列@months,看到它是空的,並愉快地打印-1

當你

for $i (keys %months) { 
    print "$i has value $months[$i].\n" 
} 

Perl將嘗試將鑰匙abc到數字,這將是0轉換。這將發出警告:

Argument "a" isn't numeric in array element ... 

然後它將打印空數組元素$month[0]。這將發出未定義的值警告。你沒有得到這些警告,因爲你沒有使用

use strict; 
use warnings; 

在你的腳本中。 strict本來會告訴你@months還沒有被聲明,並立即停止了這個bug。

你應該使用的語法是:

print "There are " . (keys %months) . " keys\n"; 
... 
print "$i has value $months{$i}\n"; 
+0

然後我怎麼知道在Hash中有多少個鍵,而沒有將Hash的元素轉換成數組,然後找到數組的大小? –

+0

@Cool_Coder對不起,我在編輯問題時接到了一個電話,說明了這一點。現在添加了。 – TLP

+0

感謝您的額外信息:) –

0

$#months$months[0]引用數組,而不是一個哈希值。您可以使用大括號$months{key}訪問哈希的值。

此外,你應該use strict;my()初始化變量。如果你這樣做了,你會得到一個編譯器錯誤@months不存在。

3

在Perl中,訪問哈希中的元素使用與數組稍有不同的語法。使用了哈希花括號,括號數組:

print "a is $months{a}\n"; # "a is 1" 

而且$#months是說「@months的最後指數」的另一種方式,當你真正的意思是算在%months鍵的數量:

printf "There are %d keys\n", scalar keys %months; 

如果你堅持print而不是printf

print "There are $#{[keys %months]} keys\n"; 

(但也許我t比你現在想要的位置提前幾步)

+0

非常感謝! 我想知道你提到的語法是否快速,如果哈希大尺寸? –

+0

我建議你試試看。如果它不足以滿足您的需求,請回過頭再回答一個問題(儘管我懷疑這會是一個問題)。 – Zaid

+1

這取決於你的意思是'大',但這是找到一個哈希鍵的數量的規範方式,我從來沒有注意到它需要任何時間。在'keys'的實現中,可能有一個快捷方式來計算在標量上下文中計算的關鍵條目,所以它實際上不會像列表上下文中那樣構建一個鍵數組。 –