我正在编辑一个perl代码,并添加了我需要传递哈希的子例程。
%OrigResultHash = Parsing(\%OrigFileHash,\%OrigParamHash);
sub Parsing {
my (%fileHash,%paramHash)=(@ARG);
my %resultHash;
foreach my $file (keys %fileHash) {
my (@fileParam)=@{$fileHash{$file}};
my (@fileStates)=grep(/^state:/,@fileParam);
运行时我收到错误消息:
不是/vobs/cores/periph/blsp_prj/scripts/flow_result_parser_with_flag_orig.pl第193行的ARRAY参考。 这是指:
foreach my $ file(keys%fileHash){
你能解释代码中的错误吗?
答案 0 :(得分:1)
您的代码存在许多问题。首先,请启用use strict
和use warnings
。
您正在传递两个参数\%OrigFileHash,\%OrigParamHash
作为参考,这是正确的,因为它们是哈希值。但是在你的sub中,你将它们分配给my (%fileHash,%paramHash)=(@ARG)
的哈希值。
这样,您最终得到%fileHash
中的一键哈希和undef
中的%paramHash
。
print Dumper \%fileHash, %paramHash;
$VAR1 = {
'HASH(0x5cad8c)' => {
'xxx' => 'asdf'
}
};
如您所见,这不是您想要的。
您所讨论的实际错误消息并非来自foreach
行。它位于您拥有my (@fileParam)=@{$fileHash{$file}}
的下面一行。正如我们在上面的Dumper
输出中看到的那样,没有数组引用,正如错误消息所示。一旦我们解决了分配问题,这将消失。您需要将引用的参数分配为标量,以便仍然是引用。如果您更喜欢使用哈希值,则可以取消引用它们。我把它合并到以下几行。
my %fileHash = %{ shift };
my %paramHash = %{ shift };
答案 1 :(得分:1)
那么,@ ARG来自哪里?相反,你应该使用@_来获取转移到子程序的值。而你的意思是什么(%fileHash,%paramHash)=(@ ARG); ? Perl使用哈希引用而不是哈希体来传递给函数,因此,你不能使用%fileHash,而只是一个标量值来存储哈希ref.So,将你的代码更改为:
%OrigResultHash = Parsing(\%OrigFileHash,\%OrigParamHash);
sub Parsing {
my ($fileHash,$paramHash)=@_;
my %resultHash;
foreach my $file (keys %$fileHash) {
my (@fileParam)=$fileHash->{$file};
.....