我想将日志的每一行(只能是2行)存储到单独的哈希中,然后检查每个键值以确定是否有增加或减少。日志文件可能每次都没有匹配的协议,因此第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
TLS:125770
我怎么能做到这一点?我试图搜索,但许多示例依赖于日志文件格式不同。如果可能,我希望解决方案在Perl中。
答案 0 :(得分:3)
哈希可以由列表填充,其中连续元素被配对为键值
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>;
或者,不要仅限于两行
while (<$fh>) {
my %line = split;
}
其中split;
使用split默认值,因此与split ' ', $_;
相同
每次都会创建新的哈希值。即使你在其他地方声明它们并以这种方式反复读入这些变量,它仍然会每次都被覆盖。如果需要将现有哈希读取更新为临时哈希,然后按键更新/检查主哈希密钥。
答案 1 :(得分:0)
while (<>) {
my %hash = split;
...
}
或
while (<>) {
push @hashes, { split };
}
...