我正在使用 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 版本对于实际问题并不那么重要,至少我希望如此......