1

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

文件 1.pl:

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

文件2.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.

请帮助

4

2 回答 2

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带入当前命名空间。

于 2013-03-27T07:55:42.807 回答
1

忽略您发布的代码与实际给出您声称的错误消息相距很多编辑的事实,您的问题是您没有%hash在 file2.pl 中声明。由于该文件使用了strictpragma(这是一件好事),因此它给出了这个致命错误。为了克服这个问题,声明散列:

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

但是,如果您尝试将其require用作加载配置文件的一种方式,还有很多更好的方法。例如Config::Any.

于 2013-03-27T07:45:24.927 回答