如何在不使用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";
}
您还可以使用sprintf
或printf
(perldoc -f sprintf,perldoc -f printf)(这些你也可以垫在数字零):
while ((my $key, $value) = each %h)
{
printf("%20s %20s\n", $key, $value);
}
答
的强大的解决方案,需要两个通道:一个确定的最长密钥的长度,其他打印输出:
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};
}
如果您知道密钥长度的上限时间提前,你可以避免第一个循环。
答
我知道你说的格式可能太重,但实际上它可能不那么复杂。尝试这样的:
foreach my $k(keys %h) {
format =
Key: @<<<<<<<<<<<<<<<< Value: @>>>>>>>>>>>>>>>>>
$k, $h{$k}
.
write;
}
希望这有助于!
use List :: Util qw(max);我的$ l =最大(地图{长度}键%哈希); – Narveson 2010-11-24 07:11:28