Perl - 遍历两个哈希,比较键和值

时间:2018-01-19 10:35:55

标签: perl hashmap

我有两个哈希,我想迭代第一个哈希键一次(tcp,tls,dns),然后在第二个哈希中找到匹配的键。从那里我想比较tcp的每个哈希值。

在我尝试这样做的那一刻,似乎匹配第二个哈希中的每个键。 TCP可以从第一个哈希中选择,但是如果我有if($ 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";
                }
        }
}

newlog.txt:

tcp 217837 tls 138531 http 50302 udp 37852 dns 23625 ldap 14160 krb5 8828 smb 2148 ssh 549 ftp 219 smtp 161 icmp 6 rdp 3 ssdp 3
tcp 198650 tls 125770 http 44260 udp 37610 dns 23827 ldap 13904 krb5 8805 smb 2128 ssh 629 ftp 219 smtp 156 icmp 5 ssdp 1

我希望为输出实现类似的功能,这显示了两个tcp值的差异,但是对于每个协议(键)。 TCP = 19187

编辑:

我在这里找到了一个解决方案: Comparing two hashes with the keys and values

解决方案:

#!/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";
        }
}

1 个答案:

答案 0 :(得分:1)

开启use strict; use warnings;

会告诉你:

Argument "ssdp" isn't numeric in numeric eq (==) at line 10

这是您应该使用eq

的提示

但更重要的是,为两个哈希嵌套each完全是多余的,因为哈希的点是直接查找。

怎么样:

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

(如果相关,则反转逻辑,以便检查line_2中的所有键,检查它们是否从line1中丢失)