我撰寫了一個腳本,它將在一定條件下從資料庫中獲取資料并將其存盤在哈希中。我需要這些存盤的哈希內容以表格格式顯示。現在我有所有應該在表中顯示的資料都存在于名為%hash.
我需要在控制臺中以表格格式顯示哈希的內容。
下面是我的腳本:
#!/usr/bin/perl
use strict; use warnings;
use Data::Dumper;
my %hash = (
'2022-08-04' => {
'Method 1' => {
'Count' => 50,
'Size' => '10 MB'
},
'Method 2' => {
'Count' => 40,
'Size' => '5 MB'
}
},
'2022-08-05' => {
'Method 1' => {
'Count' => 30,
'Size' => '3 MB'
},
'Method 2' => {
'Size' => '50 MB',
'Count' => '100'
}
}
);
my @cols;
my @keys = ('Method 1', 'Method 2');
foreach my $date (sort keys %hash){
foreach my $method (@keys) {
push (@recs, { date => $date, size => $hash{$date}{$method}{'Size'}, count => $hash{$date}{$method}{'Count'}});
}
}
print "cols:\n".Dumper(\@cols)."\n";
my $line1 = '| ' . join(' | ', map { sprintf "%-*s", 20, $_->{date} } @cols) . ' |';
my $line2 = '| ' . join(' | ', map { sprintf "%-*s", 20, $_->{size} } @cols) . ' |';
my $line3 = '| ' . join(' | ', map { sprintf "%-*s", 20, $_->{count} } @cols) . ' |';
print $line1."\n";
print $line2."\n";
print $line3."\n";
當前結果:
| 2022-08-04 | 2022-08-04 | 2022-08-05 | 2022-08-05 |
| 10 MB | 5 MB | 3 MB | 50 MB |
| 50 | 40 | 30 | 100 |
預期結果:
-----------------------------------------------------------------------------------
| Date | Method 1 Size | Method 1 Count | Method 2 Size | Method 2 Count |
-----------------------------------------------------------------------------------
| 2022-08-04 | 10 MB | 50 | 5 MB | 40 |
| 2022-08-05 | 3 MB | 30 | 50 MB | 100 |
-----------------------------------------------------------------------------------
由于我要推入的資料@cols,每個 cols 陣列元素都包含一個帶有日期、大小和計數的散列。在列印它們時,它以水平方式顯示,而不是垂直顯示。
此外,有時不會有方法 2 哈希值。在那種情況下,我需要僅在表中顯示方法 1 哈希值的內容。如何以動態方式實作它?
uj5u.com熱心網友回復:
您在欄位(復制和粘貼的行)上有一個外部回圈,在展平的記錄上有一個內部回圈。
但是所需的輸出顯示了對日期的回圈,對在欄位上回圈的方法進行了回圈。

(點擊放大以獲得更好的視圖。)
{
printf "| %-*s | ", 20, "Date";
for my $method ( "Method 1", "Method 2" ) {
printf "%-*s | %-*s |",
20, "$method Size",
20, "$method Count",
}
printf "\n";
}
for my $date ( sort keys( %hash ) ) {
my $by_method = $hash{ $date };
printf "| %-*s | ", $date;
for my $method ( "Method 1", "Method 2" ) {
my $rec = $by_method->{ $method };
printf "%-*s | %-*s |",
20, $rec->{ size },
20, $rec->{ count };
}
printf "\n";
}
里面有很多神奇的數字。
my @methods = ( "Method 1", "Method 2" );
my $date_size = 20;
my @field_defs = (
{ name => "Size", size => 20 },
{ name => "Count", size => 20 },
);
{
printf "| %-*s | ", $date_size, "Date";
for my $method ( @methods ) {
for my $field_def ( @field_defs ) {
printf "%-*s |", $field_def->{ size }, $field_def->{ name };
}
}
printf "\n";
}
for my $date ( sort keys( %hash ) ) {
my $by_method = $hash{ $date };
printf "| %-*s | ", $date_size, $date;
for my $method ( @methods ) {
my $rec = $by_method->{ $method };
for my $field_def ( @field_defs ) {
printf "%-*s |", $field_def->{ size }, $rec->{ $field_def->{ name } };
}
}
printf "\n";
}
下一步可能是計算最小尺寸,而不是使用20.
uj5u.com熱心網友回復:
添加為新答案,因為我認為這兩種風格都值得。就像我在另一個答案中所說的那樣。事先進行資料轉換。然后創建你的表。這是通過首先展平內部哈希來進行資料轉換的另一種方式。
#!/usr/bin/env perl
use strict;
use warnings;
use v5.32;
use Data::Printer;
use Text::Table;
use List::Util qw(uniqstr);
my %hash = (
'2022-08-04' => {
'Method 1' => {
'Count' => 50,
'Size' => '10 MB'
},
'Method 2' => {
'Count' => 40,
'Size' => '5 MB'
}
},
'2022-08-05' => {
'Method 1' => {
'Count' => 30,
'Size' => '3 MB'
},
'Method 2' => {
'Size' => '50 MB',
'Count' => '100'
}
}
);
# Transform %hash by flattening the inner hashes
my
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/506241.html
上一篇:如何從命令列為子例程傳遞引數
