如何在不使用Perl格式的情况下对列进行格式化?

如何在不使用Perl格式的情况下对列进行格式化?

问题描述:

通常在Perl中,我想从一个散列中打印出列/行数据。如何在不使用Perl格式的情况下对列进行格式化?

这很简单:

foreach my $k(keys %h) 
{ 
    print $k, "\t", $h{$k}, "\n"; 
} 

然而,如果密钥恰好有一个不同长度,然后格式化只是看起来很锯齿。我已经调查过format,它的重量通常太重,因为我在寻找一个“简单”列行对齐漂亮打印机。

我想你会发现printf有用。这里是一个小例子:

printf("%10s\t%10s\n", $k, $h{$k}); 
## prints "   key\t   value\n" 
## prints " longer_key\t longer_value\n" 

龙值不会被截断,并且可以改变内部块文本aligment:

  • %10s - 指长度为10(左对齐)
  • %-10s的字符串类型 - 表示长度为10的字符串类型(右对齐)

格式完整列表位于sprintf man page

可能不是最佳解决方案,但您需要找到最大密钥长度和最大长度值,然后将它们传递给sprintf或pack。或者你可以使用静态的最大长度,如果您的数据源有“合理”限制(例如,列长度限制在数据库等)

退房的x运营商(AT perldoc perlop记录),对于简单的格式化任务有用涉及填充领域特定长度:

while ((my $key, $value) = each %h) 
{ 
    print $key . (" " x (20 - length $key)) . $value, "\n"; 
} 

您还可以使用sprintfprintfperldoc -f sprintfperldoc -f printf)(这些你也可以垫在数字零):

while ((my $key, $value) = each %h) 
{ 
    printf("%20s %20s\n", $key, $value); 
} 

如果你想要一个重型解决方案,有像Text::Table这样的模块。

的强大的解决方案,需要两个通道:一个确定的最长密钥的长度,其他打印输出:

my $l = 0; 
foreach my $key (keys %hash) { 
    $l = length($key) if length($key) > $l; 
} 

foreach my $key (keys %hash) { 
    printf "%-${l}s %s\n", $key, $hash{$key}; 
} 

如果您知道密钥长度的上限时间提前,你可以避免第一个循环。

+1

use List :: Util qw(max);我的$ l =最大(地图{长度}键%哈希); – Narveson 2010-11-24 07:11:28

我知道你说的格式可能太重,但实际上它可能不那么复杂。尝试这样的:

foreach my $k(keys %h) { 
    format = 
    Key: @<<<<<<<<<<<<<<<< Value: @>>>>>>>>>>>>>>>>> 
    $k,      $h{$k} 
    . 

    write; 
} 

希望这有助于!