2010-11-23 10 views
1

テーブルをperlで表示したいのですが、行と列の名前は可変長になります。私は列をきれいに整列させたい。問題は、行と列の見出しが可変長であるため、異なるファイルの配置がずれてしまうことです。perl印刷書式設定の質問

    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 

私がしたい:私は(私がテストする必要が異なるファイルのために)次のとおりであり得る出力

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"; 
} 

:ここ

は、私はフォーマットに使用していたコードです行と列の名前にかかわらず、この出力を整列させます。誰でも助けてくれますか?

ありがとうございます!

+1

ルックで[Perl6の::フォーム](http://search.cpan.org/~dconway/Perl6-Form-0.04/Form.pm)、またはdeprecated( 'Perlベストプラクティス')Perl [form](http://perldoc.perl.org/perlform.html)の仕組み。興味深いことに、Perl6 :: FormはCPANのPerl6には載っていません。私はそれの重要性については分かりません。 –

+0

フォームの宣言を使わずに、perlformページのスワート機能を使わずに、$^Aをローカライズすることができます。 – MkV

+1

@Jonathan: 'deprecated'レキシカルで制御されていない限り、警告カテゴリ!特に、* Perlのベストプラクティス*を使って、人々を同質性と愚かさに陥らせないようにしてください。それは本のために書かれたものではありません! Damian Conway自身が言っているように、** "多くの人々は、PBPがその心臓部であることを忘れています。 - 自分のニーズを満たすために意識的かつ合理的に選択されたコードを書くことを嘆願します。** – tchrist

答えて

1

誰かが使いたい場合に備えて、ここに貼り付けて答えを見つけました。

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    
---------- | ---------------------------------------------------------------- 
+0

これがあなたの受け入れられた答えであれば、受け入れられたとマークしてください。 –

1

この行:

 
printf "%s",$realSense; 

には、特定の幅を有していない、およびアライメントをオフに投げています。

+0

アライメントを追加しても。あまり助けにならない。 – Radz

+1

整列していません。幅。 –