2012-10-25 26 views
1

我創建了全局散列,當我嘗試從perl子例程中訪問該散列時,它無法訪問它。在perl中的子例程中訪問全局散列

我已經聲明它: %HASH =();

,並試圖訪問它在子程序爲:

$HASH{$key} = $value; 

請指引我,如果我做錯了什麼

+1

散列是在同一個文件中的sub之前聲明的嗎?你有'使用嚴格'和'使用警告'嗎?發佈更多代碼 – didster

+1

顯示一些演示您的問題的相關代碼。 – TLP

+0

謝謝你們的幫助。我正在使用: push(@ {$ HASH {$ key}},$ value)推送數組中的哈希值,並未對數組進行排序,因此無法找到該值,而且在我看來,它無法訪問它。我的不好,謝謝你的幫助:) – iDev

回答

8

做工精細這裏:

#!/usr/bin/env perl 

use strict; 
use warnings; 
use feature 'say'; 

our %truth =(); # "global" truth: lexical name 
       # for the package variable %main::truth 

sub add_to_truth { 
    my ($thing, $value) = @_; 
    $truth{$thing} = $value; 
} 

add_to_truth(answer => 42); 
say $truth{answer}; 

輸出

42 

注意下strict數目字,你有自己的包名(%main::truth在這種情況下),以完全符合你的「全局」變量或爲他們創造一個詞法範圍的本地名稱與our 。今天編程沒有狹窄(和警告)是不是一件好事™。事實上,激活它們會告訴你一些有用的東西。

+2

+ Perl +幽默=) –

+0

在這種情況下,'我們'是絕對必要的嗎?我用'我'試了一下,它也起作用。據我瞭解,'我們'是用來當你想與整個包分享。 – tudor