首页 > 解决方案 > 格式化哈希内容以生成报告

问题描述

我有一个包含如下数据的哈希:

my %hash = (
    '150' => {
             'priority' => 'High',
             'node' => 'Node1',
             'delta' => '00:05:00'
           },
    '170' => {
             'delta' => '00:00:30',
             'node' => 'Node2',
             'priority' => 'Medium'
           }
);

我正在使用foreach循环迭代它并生成一个报告(.txt)文件。

所以,我需要的格式如下:

EVENTID              NODE                 DELTA                PRIORITY
-------------------- -------------------- -------------------- --------------------
150                  Node1                00:05:00             High
170                  Node2                00:00:30             Medium

下面是我格式化结果的脚本:

...
...
open(my $fh, '>', "report_file.txt") or die "Cannot open a file : $!";

printf $fh("%-20s %-20s %-20s %-20s\n", 'EVENTID', 'NODE', 'DELTA', 'PRIORITY');
printf $fh("%-20s %-20s %-20s %-20s\n", '-'x20, '-'x20, '-'x20, '-'x20);

foreach my $key (sort keys %hash){
    printf $fh("%-20s %-20s %-20s %-20s\n", $key, $hash{$key}{'node'},$hash{$key}{'delta'},$hash{$key}{'priority'});
}
close $fh;

print "END\n";

它按预期给了我报告,但想确认它是否正确?因为我在这里硬编码空格(-20s)。此外,还提到了用作标题下划线的破折号(-),例如'-'x20.

这是一个好的方法还是我们有任何替代方法来完成这个(任何预定义的 Perl 模块)?

标签: perlreport

解决方案


Perl 提供format数据输出,它最适合您的目标

use strict;
use warnings;

my %events = (
    '150' => {
             'priority' => 'High',
             'node' => 'Node1',
             'delta' => '00:05:00'
           },
    '170' => {
             'delta' => '00:00:30',
             'node' => 'Node2',
             'priority' => 'Medium'
           }
);

$^ = "STDOUT_TOP";

my($event,$priority,$node,$delta);

for $event (sort keys %events) {
    ($node,$delta,$priority) = @{$events{$event}}{qw/node delta priority/};
    write;
}

format STDOUT_TOP = 
EVENTID              NODE                 DELTA                PRIORITY
-------------------- -------------------- -------------------- --------------------
.

format STDOUT =
@<<<<                @<<<<<<<<<<<         @<<<<<<<<<<<         @<<<<<<<<<<<
$event,$node,$delta,$priority
.

输出

EVENTID              NODE                 DELTA                PRIORITY
-------------------- -------------------- -------------------- --------------------
150                  Node1                00:05:00             High
170                  Node2                00:00:30             Medium

附录:以下代码演示了如何使用格式将输出写入文件

use strict;
use warnings;

my %events = (
    '150' => {
             'priority' => 'High',
             'node' => 'Node1',
             'delta' => '00:05:00'
           },
    '170' => {
             'delta' => '00:00:30',
             'node' => 'Node2',
             'priority' => 'Medium'
           }
);

my $fname = 'hash_events.txt';

open FILE, '>', $fname
    or die "Couldn't open $fname: $!";
    
select(FILE);

$^ = "FILE_TOP";

my($event,$priority,$node,$delta);

for $event (keys %events) {
    ($node,$delta,$priority) = @{$events{$event}}{qw/node delta priority/};
    write;
}

close FILE;

format FILE_TOP = 
EVENTID              NODE                 DELTA                PRIORITY
-------------------- -------------------- -------------------- --------------------
.

format FILE =
@<<<<                @<<<<<<<<<<<         @<<<<<<<<<<<         @<<<<<<<<<<<
$event,$node,$delta,$priority
.

perlform , Perl 格式


推荐阅读