perl - 格式化哈希内容以生成报告
问题描述
我有一个包含如下数据的哈希:
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 模块)?
解决方案
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
.
推荐阅读
- c# - 如何使用目标视图模型中收集的数据从目标视图模型返回到源视图模型并在源视图模型中调用方法
- r - 使用 R 检查多个列中的值是否等于列表中的任何元素
- python - Python POST 请求显示“不可接受!”
- ruby-on-rails - 将多个数组 + 变量组合成单个 JSON 对象
- sql - 更新 SQL 中的多个值
- java - Java - 递归双阶乘算法
- azure - 标准连接器转向高级连接器。逻辑应用程序是否也受到影响
- file - 请求正文中的动态文件
- sql - How to send a query request to SQL Server via tcp ip (with a general tool, such as Packet Sender) on the same PC?
- git - VSCode:区别“创建分支”和“创建分支”