使用perl将空间分隔的日志解析为哈希

使用perl将空间分隔的日志解析为哈希,perl,hashmap,Perl,Hashmap,我想将日志的每一行(只有两行)存储到单独的散列中,然后检查每一个keys值以确定是增加了还是减少了。日志文件可能每次都没有匹配的协议,因此第2行中缺少rdp,并且可能有一个全新的协议,这就是为什么我认为使用哈希是一个好主意 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

我想将日志的每一行(只有两行)存储到单独的散列中,然后检查每一个keys值以确定是增加了还是减少了。日志文件可能每次都没有匹配的协议,因此第2行中缺少rdp,并且可能有一个全新的协议,这就是为什么我认为使用哈希是一个好主意

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:217837

tls:138531

然后我想以同样的方式将第二行读入另一个散列:

关键值

tcp:198650

电话:125770


我怎样才能做到这一点?我尝试过搜索,但许多示例都依赖于日志文件的不同格式。如果可能的话,我希望这个解决方案是用Perl编写的。

可以用一个列表填充哈希,其中连续的元素作为键值配对

my %hash = ('a', 1, 'b', 2);   #--> %hash is (a => 1, b => 2)
所以你可以对每一行这样做,通过在空白处拆分它

open my $fh, $filename or die "Can't open $filename: $!";
my %line_1 = split ' ', <$fh>;
my %line_2 = split ' ', <$fh>;
打开我的$fh、$filename或死亡“无法打开$filename:$!”;
我的%line_1=拆分“”;
我的%line_2=拆分“”;
或者,不要把自己限制在两行以内

while (<$fh>) {
    my %line = split;
}
while(){
我的%行=拆分;
}
其中
split使用默认值,因此与拆分相同,$

这将每次创建新的哈希。即使您在其他地方声明它们并以这种方式反复读取这些变量,每次都会被覆盖。如果需要将已读取的现有散列更新为临时散列,然后逐个键更新/检查主散列键。

while(){
while (<>) {
   my %hash = split;
   ...
}
我的%hash=split; ... }

while(){
push@hashes,{split};
}
...
while (<>) {
   push @hashes, { split };
}

...