【问题标题】:perl print formatting questionperl 打印格式问题
【发布时间】: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


【解决方案1】:

这一行:

printf "%s",$realSense;

没有特定的宽度,并且正在偏离对齐方式。

【讨论】:

  • 即使我添加对齐方式。它没有太大帮助。
【解决方案2】:

找到答案,把它贴在这里,以防有人想使用它。

printf "%10s %-2s",'----------','|';

foreach(keys(%senseToSenseCountHash))
{
    printf "%s",'----------------';
}
print "\n";

printf "%10s %-2s",'          ','|';

foreach(keys(%senseToSenseCountHash))
{
    printf "%-14s",$_;
}
print "\n";

printf "%10s %-2s",'----------','|';

foreach(keys(%senseToSenseCountHash))
{
    printf "%s",'----------------';
}
print "\n";

foreach my $key (sort { $senseToSenseCountHash{$b} <=> 
                              $senseToSenseCountHash{$a} } keys %senseToSenseCountHash )
{
    $maxSense = $senseToSenseCountHash{$key};
    last;   
}

my $space = "---";

foreach my $realSense (keys(%actualSenseToWronglyDisambiguatedSense))
{

    printf "%-10s %-2s",$realSense,'|'; 
        foreach (keys(%senseToSenseCountHash))
    {
        if(exists($actualSenseToWronglyDisambiguatedSense{$realSense}[0]{$_}))
        {
            printf "%-15s",$actualSenseToWronglyDisambiguatedSense{$realSense}[0]{$_};
        }
        else
        {
            printf "%-15s",$space;
        }
    }
    print "\n";
}

printf "%10s %-2s",'----------','|';

foreach(keys(%senseToSenseCountHash))
{
    printf "%s",'----------------';
}
print "\n";

输出:

---------- | ------------------------------------------------
           | HARD3         HARD2         HARD1         
---------- | ------------------------------------------------
HARD3      | 68             7              27             
HARD2      | 6              60             90             
HARD1      | 37             69             937            
---------- | ------------------------------------------------


---------- | ----------------------------------------------------------------
           | SERVE12       SERVE2        SERVE6        SERVE10       
---------- | ----------------------------------------------------------------
SERVE12    | 319            32             19             8              
SERVE2     | 44             159            39             25             
SERVE6     | 22             9              102            1              
SERVE10    | 14             16             12             494            
---------- | ----------------------------------------------------------------

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多