我有两个哈希,我想迭代第一个哈希键一次(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";
}
}
答案 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中丢失)