如何打印另一个文件中定义的哈希元素?

时间:2013-03-27 07:27:16

标签: perl hash require

如何打印在另一个文件中定义的哈希元素?

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.

请帮助

2 个答案:

答案 0 :(得分: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中列出的变量和子列表引入当前名称空间。

答案 1 :(得分:1)

忽略您发布的代码远离实际提供您声明的错误消息的许多编辑这一事实,您的问题是您没有在file2.pl中声明%hash。由于该文件使用strict pragma(这是一件好事),它会给出这个致命的错误。要解决这个问题,请声明哈希:

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

但是,如果您尝试使用require作为加载配置文件的方法,则有许多更好的方法。例如Config::Any