我正在使用Perl 5.8.8分析一个日志文件。 [1] 我正在寻找暴露两种触发模式的日子,可能是其中一种,也许两种(我改变了)下面显示的代码段中的实际模式)。我对每天发生的次数感兴趣,下一步将是制作它的电子表格,这就是输出格式化标签的原因。
因为一天中只能出现一种模式,我需要一种方法来组合两个散列的键。我做了一个新的哈希。是否有内置功能?我在网上搜索并堆叠溢出而没有任何结果,我在这里得到的唯一一个是Build a string from 2 hashes,但在这种情况下,密钥集是相同的。
#!/usr/bin/perl -w
use strict;
use warnings;
use locale;
# input analysis: searching for two patterns:
my %pattern_a = ();
my %pattern_b = ();
foreach my $line (<>) {
if ($line =~ m/^(\d{4}-\d{2}-\d{2})(.+)$/) {
my $day = $1;
my $what = $2;
if ($what =~ m/beendet/) {
$pattern_a{$day} ++;
} elsif ($what =~ m/ohne/) {
$pattern_b{$day} ++;
}
}
}
# generate the union of hash keys: <-- In Question
my %union = ();
$union{$_} = 1 for keys %pattern_a;
$union{$_} = 1 for keys %pattern_b;
# formatted output sorted by day:
foreach my $day (sort keys %union) {
print join "\t", $day,
($pattern_a{$day} || 0),
($pattern_b{$day} || 0)."\n";
}
预期输出如下:
2017-02-01 0 1
2017-02-18 0 592
2017-02-19 2 0
[1] 我知道这个Perl版本已经过时了。但我很少使用Perl,但是当我这样做时,它必须快速进行。所以搞清楚Perl版本等等以后再做。但Perl版本对于实际问题并不那么重要,至少我希望如此......