Perl:添加到哈希数组

时间:2013-10-13 22:18:25

标签: arrays perl hash

我正在尝试在哈希值中向数组添加值。

foreach my $f (@files) {
  my $file = "$logDir/$f";
  open my $info, $file or die "Could not open $file: $!";
  while (my $line = <$info>) {
    chomp $line;
    if ($line =~ /CONN.*\[ID=(.*)\].*ID is(.*)/) {
      $b = $1;
      $a = $2;
      $a =~ s/^\s+//;
      $bHash{$b} = $a if (exists $aHash{$a});
    }
    elsif ($line =~ /succ.*\[ID=(.*)\].*/) {
      $b = $1;
      push(@{ $bHash{$b} }, "bSUCC") if (exists $bHash{$b});
    }
    elsif ($line =~ /fail.*\[ID=(.*)\].*/) {
      $b = $1;
      push(@{ $bHash{$b} }, "bFAIL") if (exists $bHash{$b});
    }
  }
  close $info;
}

我根据事务ID和b的事务id将两个日志文件链接在一起,这两个日志文件都在b日志的单个日志行中找到。

第一个if语句会对其进行检查,并使用b-&gt; ID = a-&gt; Id填充%bHash

然后我正在寻找b的交易成功或失败。如果我看到成功行,我会获取事务ID,如果%bHash中存在该ID,那么我想将“bSucc”消息推送到数组的末尾,即%bHash将有bSid - &GT; aSid,bSucc。

我收到以下错误/警告消息:

Can't use string ("7747395") as an ARRAY ref while "strict refs" in use at ./report.pl line 54, <$info> line 833.

有办法做到这一点吗?

我还希望在可能的情况下继续向数组添加信息,因为我扫描日志以获取更多数据。我想使用事务ID作为密钥,只需根据需要添加信息。这可能吗?有没有更好的方法来完成任务?

编辑:我想要完成的是在3个不同的日志文件中编译有关事务的信息。我想为每个事务找到以下内容:失败的成功,如果失败,它在哪里失败,在日志a,b或c中?

一个交易由3个不同的应用程序处理,因此有3个不同的日志。不幸的是,app app与app b和c的trans id不同。所以我用log a中的所有trans id构建了一个哈希,然后log b中有一个日志行,它允许你看到用于log a的trans id和用于log b的trans id之间的链接。这就是我将b中的trans id与log a中的hash相匹配的原因。最终我想要上面提到的每个transId的信息,成功/失败等等。

1 个答案:

答案 0 :(得分:3)

问题在于,当您最初在%bHash中设置每个值时,您将其设置为字符串值,而不是arrayref:

      $bHash{$b} = $a if (exists $aHash{$a});

稍后,您尝试通过取消引用将值推送到“数组”:

      push(@{ $bHash{$b} }, "bSUCC") if (exists $bHash{$b});

但由于 没有数组,只是一个字符串,Perl认为你试图将字符串取消引用到数组中。 (我应该注意,这实际上是合法的 - 如果$a是字符串'foo',那么@$a表示全局变量@foo - 但不建议这样做,不允许在use strict的范围内,显然不是你想要做的。我之所以提到它只是因为错误信息的文本认为这是你试图使用的功能。)

修复只是使用arrayref开头:

      $bHash{$b} = [$a] if (exists $aHash{$a});

这样你就可以安全地将值推到数组上。