Perl-循环两个哈希,比较键和值

Perl-循环两个哈希,比较键和值,perl,hashmap,Perl,Hashmap,我有两个散列,我想在第一个散列密钥上迭代一次(tcp、tls、dns),然后在第二个散列中找到匹配的密钥。从这里,我想比较tcp的每个散列中的值 当我尝试这样做时,它似乎在第二个散列中的每个键上都匹配。TCP可以从第一个散列中选择,但如果($key1==$key2),它将匹配多次,即使键彼此不匹配。可能是我对每一个都没有正确的理解 #!/usr/bin/perl open my $fh, "newlogs.txt" or die $!; my %line_1 = split ' ', <

我有两个散列,我想在第一个散列密钥上迭代一次(tcp、tls、dns),然后在第二个散列中找到匹配的密钥。从这里,我想比较tcp的每个散列中的值

当我尝试这样做时,它似乎在第二个散列中的每个键上都匹配。TCP可以从第一个散列中选择,但如果($key1==$key2),它将匹配多次,即使键彼此不匹配。可能是我对每一个都没有正确的理解

#!/usr/bin/perl

open my $fh, "newlogs.txt" or die $!;
my %line_1 = split ' ', <$fh>;
my %line_2 = split ' ', <$fh>;

while (my($key1, $value1) = each %line_1) {
        while (my($key2, $value2) = each %line_2) {
                if ($key1 == $key2) {
                        print "$key1 $key2\n";
                }
        }
}
我希望对显示两个tcp值差异的输出实现类似的功能,但对于每个协议(密钥)。 tcp=19187

编辑:

我在这里找到了一个解决方案:

解决方案:

#!/usr/bin/perl

open my $fh, "newlogs.txt" or die $!;
my %line_1 = split ' ', <$fh>;
my %line_2 = split ' ', <$fh>;

for (keys %line_1) {
        unless (exists $line_2{$_} ){
                print "$_: not found in second hash\n";
                next;
        }
        if ($line_1{$_} eq $line_2{$_} ) {
                print "$_: no change \n";
        }
        else {
                #print "$_: values are not equal\n";
                my $result = $line_1{$_} - $line_2{$_};
                print "$result\n";
        }
}
#/usr/bin/perl
打开我的$fh,“newlogs.txt”或die$!;
我的%line_1=拆分“”;
我的%line_2=拆分“”;
用于(键%1行){
除非(存在$line_2{$}){
打印“$\未在第二个哈希中找到\n”;
下一个
}
if($line_1{$}eq$line_2{$}){
打印“$\:无更改\n”;
}
否则{
#打印“$\:值不相等\n”;
my$result=$line_1{$}-$line_2{$};
打印“$result\n”;
}
}

打开
严格使用
使用警告

它会告诉你:

Argument "ssdp" isn't numeric in numeric eq (==) at line 10
这提示您应该使用
eq

但更基本的是,为两个散列嵌套一个
每个
,这是完全冗余的,因为散列的点是直接查找

那么:

foreach my $key ( keys %line_1 ) {
   if ( $line_2{$key} ) { 
       print "Match found for $key\n";
       if ( $line_1{$key} ne $line_2{$key} ) { 
           print "$key $line_1{$key} doesn't match $line_2{$key}\n";
       }
   }
   else { 
     print "No key $key found in line 2\n";
   } 
}

(如果相关,请反转逻辑,以便检查第2行中的所有键,以检查它们是否从第1行中丢失)

我想在空格上拆分它,这样部分就可以了,散列就可以了。现在只需要对它们进行操作。给定输入行,您想要的结果是什么?这个“编辑”似乎和您描述的一样--缺少什么吗?如果这确实是一个好的解决方案,那么最好将该部分作为答案发布(您可以发布您自己问题的答案,当您找到解决方案时,这是一个好主意)。但有一件事:如果确实希望在关键帧不匹配时打印(除非
),则当
%line\u 2
中的关键帧不在
%line\u 1
中时,您将丢失这些情况。但是你似乎并不关心这一点,而且可能会删除
,除非
块。
每个
确实有点棘手。。。但我不确定哪里出了问题,您的尝试是合理的。请始终使用
警告
使用严格在开头。这真的很有帮助。我不知道这是“冗余的”——他们合理地希望在一个调用中为每个哈希同时获取键和值。但嵌套的
每个
似乎都有问题。问题是-您不必迭代第二个哈希来查找匹配的键。。。因为你知道钥匙,可以直接查。啊,这就是你的意思。是的,但我仍然喜欢显式检查键是否存在。顺便说一句,我逐字检查了OP的代码,它就工作了。所以我很困惑什么对他们不起作用。但是,总的来说,你是对的,我不会把
每一个都嵌套在这里。
foreach my $key ( keys %line_1 ) {
   if ( $line_2{$key} ) { 
       print "Match found for $key\n";
       if ( $line_1{$key} ne $line_2{$key} ) { 
           print "$key $line_1{$key} doesn't match $line_2{$key}\n";
       }
   }
   else { 
     print "No key $key found in line 2\n";
   } 
}