Arrays Perl:添加到哈希数组
我试图在散列中向数组添加值Arrays Perl:添加到哈希数组,arrays,perl,hash,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;
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作为密钥,并根据需要添加信息。这可能吗?有没有更好的方法来完成这项任务
编辑:我试图完成的是跨3个不同的日志文件编译有关事务的信息。我想在日志a、b或c中找到每个事务的以下内容:失败的成功,如果失败,它在哪里失败
一个事务由3个不同的应用程序处理,因此有3个不同的日志。不幸的是,应用程序a中的trans id与应用程序b和c中的不同。因此,我用日志a中的所有trans id构建了一个哈希,然后在日志b中有一个日志行,允许您查看用于日志a的trans id和用于日志b的trans id之间的链接。这就是为什么我要将b中的trans id与日志a中的哈希进行匹配。最后,我需要上面提到的每个transId的信息,sucs/fail等。问题是,当您最初在
%bHash
中设置每个值时,您将其设置为字符串值,而不是arrayref:
$bHash{$b} = $a if (exists $aHash{$a});
稍后,您将尝试通过解引用将值推送到“数组”上:
push(@{ $bHash{$b} }, "bSUCC") if (exists $bHash{$b});
但是由于没有数组,只有一个字符串,Perl认为您正在尝试将字符串解引用到数组中。(我应该指出,这实际上是潜在合法的-如果$a
是字符串'foo'
,那么@$a
意味着全局变量@foo
-但这不建议,在使用strict
的范围内不允许,显然不是您想要做的。我提到它只是因为er的文本ror消息认为这就是您尝试使用的功能。)
修复方法只是使用arrayref开始:
$bHash{$b} = [$a] if (exists $aHash{$a});
因此,您可以安全地将值推送到数组中。问题是,当您最初在
%bHash
中设置每个值时,您将其设置为字符串值,而不是arrayref:
$bHash{$b} = $a if (exists $aHash{$a});
稍后,您将尝试通过解引用将值推送到“数组”上:
push(@{ $bHash{$b} }, "bSUCC") if (exists $bHash{$b});
但是由于没有数组,只有一个字符串,Perl认为您正在尝试将字符串解引用到数组中。(我应该指出,这实际上是潜在合法的-如果$a
是字符串'foo'
,那么@$a
意味着全局变量@foo
-但这不建议,在使用strict
的范围内不允许,显然不是您想要做的。我提到它只是因为er的文本ror消息认为这就是您尝试使用的功能。)
修复方法只是使用arrayref开始:
$bHash{$b} = [$a] if (exists $aHash{$a});
因此,您可以安全地将值推送到数组中。问题是,当您最初在
%bHash
中设置每个值时,您将其设置为字符串值,而不是arrayref:
$bHash{$b} = $a if (exists $aHash{$a});
稍后,您将尝试通过解引用将值推送到“数组”上:
push(@{ $bHash{$b} }, "bSUCC") if (exists $bHash{$b});
但是由于没有数组,只有一个字符串,Perl认为您正在尝试将字符串解引用到数组中。(我应该指出,这实际上是潜在合法的-如果$a
是字符串'foo'
,那么@$a
意味着全局变量@foo
-但这不建议,在使用strict
的范围内不允许,显然不是您想要做的。我提到它只是因为er的文本ror消息认为这就是您尝试使用的功能。)
修复方法只是使用arrayref开始:
$bHash{$b} = [$a] if (exists $aHash{$a});
因此,您可以安全地将值推送到数组中。问题是,当您最初在
%bHash
中设置每个值时,您将其设置为字符串值,而不是arrayref:
$bHash{$b} = $a if (exists $aHash{$a});
稍后,您将尝试通过解引用将值推送到“数组”上:
push(@{ $bHash{$b} }, "bSUCC") if (exists $bHash{$b});
但是由于没有数组,只有一个字符串,Perl认为您正在尝试将字符串解引用到数组中。(我应该指出,这实际上是潜在合法的-如果$a
是字符串'foo'
,那么@$a
意味着全局变量@foo
-但这不建议,在使用strict
的范围内不允许,显然不是您想要做的。我提到它只是因为er的文本ror消息认为这就是您尝试使用的功能。)
修复方法只是使用arrayref开始:
$bHash{$b} = [$a] if (exists $aHash{$a});
这样您就有了一个可以安全地将值推送到的数组。这根本不起作用,因为您正在将
$bHash{$b}
初始化到A事务ID,然后尝试将其推送到事务ID上,就好像它是数组引用一样。请显示您的数据文件格式,并准确描述您需要执行的操作。它看起来真的属于数据库。请学习如何正确格式化Perl,尤其是在提问之前。此外,决不能将$a
和$b
用作通用变量,首先是因为它们根本不是描述性的(这与您不应调用哈希%bHash
的原因相同)第二个原因是Perl在内部使用它们,您可能会遇到访问冲突。添加了一些关于我存储信息的最终目标的详细信息。这根本不起作用,因为您正在初始化a事务ID的$bHash{$b}
,然后尝试将其作为数组引用。请显示您的数据文件格式,并准确描述您需要执行的操作。它看起来真的属于数据库。请学习如何正确格式化Perl,尤其是在提问之前。此外,您决不能将$a
和$b
用作通用变量,首先是因为它们根本不是描述性的(这与您不应调用哈希%bHash
的原因相同),其次是因为P在内部使用它们