【发布时间】:2016-12-12 17:43:38
【问题描述】:
我尝试遍历包含其他哈希的哈希。
我得到错误:
全局符号“%arch_”需要明确的包名
这是一个代码:
my %ARCH_CODES = (
armv7 => {id => 102, desc => "aaaaaa"},
i386 => {id => 103, desc => "bbbbbb"},
x86_64 => {id => 104, desc => "cccccc"},
arm64 => {id => 105, desc => "dddddd"}
);
sub af_exit
{
my %_error = @_;
writeLogAndPrint($_error{'id'});
exit($_error{'id'});
}
所以我想在armv7、i386 等上循环运行并将哈希映射发送到af_exit
for my $arch_ (keys %ARCH_CODES) {
foo($ARCH_CODES{$arch_});
# tried foo(%{ $ARCH_CODES{$arch_} } )
}
问题发生在foo 方法中:
sub foo
{
my %arch = @_; # here I get an ERROR: Global symbol "%arch_" requires explicit package name
my $res = runCommand("file zzz | grep \"$arch{id})\"");
af_exit($ARCH_CODES{$arch});
}
}
第二个问题是 af_exit 应该接收 hash 所以我需要以某种方式将 $ARCH_CODES{$arch} 转换为 hash 而不是标量
我尝试制作类似于this answer: Perl:Access values of hash inside a hash 但得到相同的错误
有什么想法吗?
【问题讨论】:
-
$ARCH_CODES{$arch_}是一个包含值 =>{id => 102, desc => "aaaaaa"}的哈希引用,您可以使用my $arch = @_获取哈希引用,然后像foreach my $keys ( keys %$arch )一样访问此哈希引用 -
@AbhiNickz 但在这种情况下我不能使用
af_exit($ARCH_CODES{$arch}); -
您可以使用
af_exit($arch);,它将hash引用发送给子,然后您可以像my $_error = @_;一样再次使用它 -
将
my %_error = @_;更改为my %_error = %{$_[0]};
标签: perl