2013-03-27 17 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

相关问题