2010-11-23 5 views
1

Ich möchte eine Tabelle in Perl anzeigen, deren Zeilen- und Spaltennamen variable Länge haben. Ich möchte, dass die Spalten sauber ausgerichtet sind. Das Problem besteht darin, dass die Zeilen- und Spaltenüberschriften von variabler Länge sind, sodass die Ausrichtung für verschiedene Dateien verschoben wird. HierPerl Druckformatierungsfrage

ist der Code, ich verwende zu Format:

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

Die Ausgänge I erhalten sind wie folgt (für verschiedene Dateien, die ich habe zu testen, auf):

    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 

Ich möchte Diese Ausgabe muss unabhängig vom Zeilen- und Spaltennamen ausgerichtet werden. Kann mir bitte jemand helfen?

Thanks so much!

+1

Blick auf [Perl6 :: Form] (http://search.cpan.org/~dconway/Perl6-Form-0.04/Form.pm) oder veraltet (in 'Perl Best Practices') Perl [form] (http://perldoc.perl.org/perlform.html) Mechanismus. Interessanterweise ist Perl6 :: Form bei CPAN unter Perl6 nicht aufgeführt; Ich bin mir ihrer Bedeutung nicht sicher. –

+0

Sie können die Formline-Funktion verwenden, ohne eine Formatdeklaration zu verwenden, wie die Schriftsfunktion auf der Perlform-Seite, aber localizing $^A – MkV

+1

@ Jonathan: Bitte sagen Sie den Leuten nicht, dass Dinge veraltet sind, es sei denn, es ist etwas, das durch das 'veraltet' lexikalisch kontrolliert wird Warnungskategorie! Insbesondere * BITTE * VERWENDEN SIE KEINE * Perl Best Practices *, um Menschen in Homogenität und Albernheit zu verwickeln. Dafür wurde das Buch nicht geschrieben! Damian Conway selbst sagt: "So viele Leute vergessen, dass PBP - in ihrem Herzen - ein Plädoyer dafür war, dass Code in * jedem * konsistenten Stil geschrieben werden sollte, bewusst und vernünftig gewählt, um die eigenen Bedürfnisse zu erfüllen." ** – tchrist

Antwort

1

Die Antwort gefunden, hier einfügen, falls jemand sie verwenden möchte.

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

Ausgang:

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

Wenn dies Ihre akzeptierte Antwort ist, dann markieren Sie diese bitte als akzeptiert. –

1

diese Zeile:

 
printf "%s",$realSense; 

hat keine bestimmte Breite und ist die Ausrichtung Abwerfen.

+0

Auch wenn ich eine Ausrichtung hinzufüge. Es hilft nicht zu viel. – Radz

+1

Nicht ausgerichtet. Breite. –