0

我正在尝试将值添加到哈希中的数组。

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;
}

我根据 a 的事务 id 和 b 的事务 id 将两个日志文件链接在一起,它们都位于 b 日志的单个日志行中。

第一条if语句对此进行检查,并%bHash使用 b->ID = a->Id 进行填充。

然后我正在寻找 b 的交易是成功还是失败。如果我看到一个成功行,我将获取事务 ID,如果该 ID 存在,%bHash那么我想将“bSucc”消息推送到数组的末尾,即%bHash有 bSid -> 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 个不同的日志。不幸的是,应用程序 a 与应用程序 b 和 c 中的 trans id 不同。所以我用 log a 中的所有 trans id 构建了一个哈希,然后在 log b 中有一个 log 行,它允许您查看用于 log a 的 trans id 和用于 log b 的 trans id 之间的链接。这就是为什么我将来自 b 的 trans id 与来自 log a 的哈希进行匹配。最终,我想要上面提到的每个 transId 的信息,成功/失败等。

4

1 回答 1

3

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

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

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

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

但是由于没有数组,只有一个字符串,Perl 认为您正在尝试将字符串取消引用到一个数组中。(我应该指出,这实际上是可能合法的——如果$a是 string 'foo',则@$a表示全局变量@foo——但不建议这样做,不允许在 的范围内use strict,而且显然不是你想要做的。我只提到它因为错误消息的文本认为这是您尝试使用的功能。)

解决方法是简单地使用 arrayref 开始:

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

这样你就有了一个可以安全地将值推送到的数组。

于 2013-10-13T22:49:01.307 回答