组合哈希的键用于输出(哈希的外连接)

时间:2017-02-23 11:04:03

标签: perl hash log-analysis set-union perl5.8

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

0 个答案:

没有答案