总结一下:
- 我有一个主脚本,里面有一个哈希值
- 这个主脚本调用一个包,其中我有一个子例程,我想从中修改这个全局哈希的内容(向其中添加元素)
这是我放入 /tmp 中的代码的极其简化的提取,以说明我的问题:
主脚本(/tmp/nonstdtest.pl):
#!/usr/bin/perl
use lib '/tmp';
use TEST;
use Data::Dumper;
my %nonstd;
tNumber(\%nonstd);
print Dumper(\%nonstd);
包(/tmp/TEST.pm):
package TEST;
use strict;
use warnings;
use Exporter;
our @ISA= qw( Exporter );
our @EXPORT_OK = qw( tNumber );
our @EXPORT = qw( tNumber );
sub tNumber {
my $nonstd = shift;
$nonstd = %$nonstd;
$nonstd{'example'} = 'test_here';
}
问题,输出是:
Global symbol "%nonstd" requires explicit package name at /tmp/TEST.pm line 15.
Compilation failed in require at /tmp/nonstdtest.pl line 5.
BEGIN failed--compilation aborted at /tmp/nonstdtest.pl line 5.
问题:如何使用包中定义的子例程修改 %nonstd (在主脚本中定义)的内容?
我尝试在没有包的情况下(在同一脚本内)执行此操作,并且它运行正常(只要我在子例程中保留具有相同名称的哈希值),所以我在这里做错了。
我在上面的示例中期望的结果只是让 %nonstd 填充 1 个键/值对 (example/test_here)
你的问题是一个错字:
正在尝试从 获取密钥
%nonstd
,但您声明了my $nonstd
,这是一个标量。它们不是同一个变量。它违反了 strict pragma,这就是我们使用 strict 的原因,因为它可以帮助我们发现拼写错误。它应该是:
使用箭头运算符
->
作为哈希引用。但这也是错误的:您已经有了哈希引用,但现在您将其替换为哈希的大小,这就是将哈希放入标量上下文中时得到的结果。所以实际上,您已经破坏了哈希引用。只需删除这一行即可。
之后,它按预期工作并打印出: