2013-03-27 23 views
1

如何打印在另一個文件中定義的散列元素?如何打印在另一個文件中定義的散列元素?

file1.pl:

#!/usr/bin/perl 
use strict; 
use warnings; 
our %hash = 
("Quarter" , 25, 
"Dime" , 10, 
"Nickel" , 5); 

file2.pl:

#!/usr/bin/perl 
use strict; 
use warnings; 
require "file1.pl" 
foreach (sort keys %hash){ 
print "$hash{$_}\n"; 
} 

輸出:

Global symbol "%hash" requires explicit package name. 
Global symbol "%hash" requires explicit package name. 

請幫助

+0

以供將來參考,請選擇您的代碼,然後按Ctrl-K或工具欄,以使你的代碼看起來正確的相應按鈕。 – ikegami 2013-03-27 07:30:13

+0

(忽略我的投票關閉。我在關閉投票提到的職位已經插入了一個錯誤,因爲昨天他們的回答。) – ikegami 2013-03-27 07:37:33

+0

http://stackoverflow.com/questions/4543934/how-to-share-export-a- global-variable-between-two-different-perl-scripts這個問題看起來類似於你所需要的。 – 2013-03-27 08:28:36

回答

2

模塊需要一個package聲明,並且必須以真值結束。 (它目前返回一個真實值,但我喜歡使用明確的1;。)最好給他們.pm擴展名。現在

# MyConfig.pm 
package MyConfig; 
use strict; 
use warnings; 
our %hash = (
    "Quarter" => 25, 
    "Dime" => 10, 
    "Nickel" => 5, 
); 
1; 

,如果你留在這一點,你需要使用%MyConfig::hash,而不是%hash。所以我們需要將var從模塊導出到用戶的命名空間。

# MyConfig.pm 
package MyConfig; 
use strict; 
use warnings; 
use Exporter qw(import); 
our @EXPORT = qw(%hash); 
our %hash = (
    "Quarter" => 25, 
    "Dime" => 10, 
    "Nickel" => 5, 
); 
1; 

所以到腳本:

#!/usr/bin/perl 
use strict; 
use warnings; 
use MyConfig; 
for (sort keys %hash) { 
    print "$hash{$_}\n"; 
} 

use MyConfig;做了規定(如有必要)和進口。後者將@EXPORT中列出的變量和子集帶入當前名稱空間。

+0

非常感謝!這將有很大的幫助! – 2013-03-27 07:58:56

+0

您希望使用正確模塊的原因是,您可以在應用程序中的多個位置「使用MyConfig」,而沒有任何問題。在這個特定的項目中可能不需要,但是做'helper.pl'或者死於$ @;'是一個不好的習慣,即使它縮短了幾行。不過,TLP建議爲配置文件使用實際配置文件格式是一個非常好的主意。 – ikegami 2013-03-27 08:04:16

+0

我明白你的觀點。我還有一個疑問。現在,如果我必須聲明一個包,文件是否必須是.pm文件?或者任何其他文件格式會做什麼? – 2013-03-27 08:06:27

1

忽略這樣一個事實,即您發佈的代碼與實際給出您聲明的錯誤消息相比有很多修改,您的問題是您沒有在file2.pl中聲明%hash。由於該文件使用strict編譯指示(這是一件好事),它會產生這個致命錯誤。爲了克服這個問題,聲明哈希:

our %hash; 
require 'file1.pl'; 
#... etc. 

但是,如果你要使用require作爲加載配置文件的方式,有很多更好的方法。例如Config::Any

+0

@TLP 如果我宣佈在file2.pl哈希 說,我們的哈希%; 它如何訪問file1.pl中定義的哈希? – 2013-03-27 07:52:38

+0

@VinodRM它們都引用相同的變量'%main :: hash'。如果您宣佈了一個包裹,例如'包MyConfig'就像ikegami的答案一樣,你可以在file1.pl中使用'%MyConfig :: hash'。這是原始錯誤消息中提到的顯式包名稱。 – TLP 2013-03-27 08:08:32

相關問題