在perl脚本中出错时不是ARRAY引用

时间:2013-09-29 08:01:53

标签: arrays perl hash subroutine

我正在编辑一个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){

你能解释代码中的错误吗?

2 个答案:

答案 0 :(得分:1)

您的代码存在许多问题。首先,请启用use strictuse 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};
    .....