【发布时间】:2010-11-23 02:38:00
【问题描述】:
我想在 perl 中显示一个表格,其中的行和列名称将是可变长度的。我希望列整齐地对齐。问题是行和列标题的长度可变,因此不同文件的对齐方式会发生偏移。
这是我用来格式化的代码:
print "\n ";
foreach (keys(%senseToSenseCountHash))
{
printf "%15s",$_;
}
print "\n";
print "------------------------------------------------------------\n";
my $space = "---";
foreach my $realSense (keys(%actualSenseToWronglyDisambiguatedSense))
{
printf "%s",$realSense;
foreach (keys(%senseToSenseCountHash))
{
if(exists($actualSenseToWronglyDisambiguatedSense{$realSense}[0]{$_}))
{
printf "%15s",$actualSenseToWronglyDisambiguatedSense{$realSense}[0]{$_};
}
else
{
printf "%15s",$space;
}
}
print "\n";
}
我得到的输出如下(对于我必须测试的不同文件):
Microsoft IBM
------------------------------------------------------------
Microsoft 896 120
IBM 66 661
SERVE12 SERVE2 SERVE6 SERVE10
------------------------------------------------------------
SERVE12 319 32 19 8
SERVE2 44 159 39 25
SERVE6 22 9 102 1
SERVE10 14 16 12 494
HARD3 HARD2 HARD1
------------------------------------------------------------
HARD3 68 7 27
HARD2 6 60 90
HARD1 37 69 937
无论行名和列名如何,我都想让这个输出对齐。有人可以帮忙吗?
非常感谢!
【问题讨论】:
-
查看Perl6::Form,或已弃用的(在“Perl 最佳实践”中)Perl form 机制。有趣的是,Perl6::Form 并未在 Perl6 下的 CPAN 中列出;我不确定这有什么意义。
-
你可以使用formline函数而不使用格式声明,就像perlform页面中的swrite函数,但是本地化$^A
-
@Jonathan:请不要告诉人们某些东西已被弃用,除非它是由
deprecated词汇警告类别控制的!特别是 PLEASE ̲D̲O̲ ̲N̲O̲T̲ ̲U̲S̲E̲ Perl 最佳实践 使人们陷入同质化和愚蠢的境地。这不是本书的目的! Damian Conway 自己说:“很多人忘记了 PBP 的核心是呼吁以任何一致的风格编写代码,有意识地和理性地选择以满足自己的需求。 ” -
@Jonathan:也就是说,我赞同你使用 Perl6::Form 的建议。
-
@tchrist:我不相信我的评论会用任何东西打击任何人。我只是指出 Perl 表单机制也存在,但 PBP 书出于各种原因确实建议不要使用它们(这些原因很合理,但我不打算在这里解释)。基本上,只是指出传统表单机制的缺点(以及一些优点)。
标签: perl formatting