2010-11-23 21 views
1

Je veux afficher une table en perl, dont les lignes et les noms de colonnes seront de longueur variable. Je veux que les colonnes soient parfaitement alignées. Le problème est que les en-têtes de ligne et de colonne ont une longueur variable, donc l'alignement se décale pour différents fichiers.perl print formating question

Voici le code que je utilise au 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"; 
} 

Les sorties que je reçois sont les suivantes (pour les fichiers différents que je dois tester sur):

    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 

Je veux rendre cette sortie alignée indépendamment du nom de la ligne et de la colonne. quelqu'un peut-il aider s'il vous plait?

Merci beaucoup!

+1

Regardez (http://search.cpan.org/~dconway/Perl6-Form-0.04/Form.pm) [Perl6 :: Formulaire], ou déconseillé (dans Perl Best Practices) Perl [form] (http://perldoc.perl.org/perlform.html) mécanisme. Fait intéressant, Perl6 :: Form n'est pas répertorié dans CPAN sous Perl6; Je ne suis pas sûr de la signification de cela. –

+0

Vous pouvez utiliser la fonction formline sans utiliser de déclaration de format, comme la fonction swrite dans la page perlform, mais en localisant $^A – MkV

+1

@Jonathan: Ne dites pas aux gens que les choses sont dépréciées sauf si elles sont contrôlées par le lexical 'deprecated' catégorie d'avertissements! En particulier, * S'IL VOUS PLAÎT * NE PAS utiliser * Perl Best Practices * pour matraquer les gens dans l'homogénéité et la sottise. Ce n'est pas ce que le livre a été écrit pour! Damian Conway dit lui-même: "Tant de gens oublient que PBP était - en son cœur - un plaidoyer pour que le code soit écrit dans un style cohérent, consciemment et rationnellement choisi pour répondre à ses propres besoins." ** – tchrist

Répondre

1

J'ai trouvé la réponse, en la collant ici au cas où quelqu'un voudrait l'utiliser.

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

Sortie:

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

Si c'est votre réponse acceptée, veuillez la marquer comme acceptée. –

1

Cette ligne:

 
printf "%s",$realSense; 

n'a pas de largeur spécifique, et jette hors de l'alignement.

+0

Même si j'ajoute un alignement à celui-ci. Cela n'aide pas trop. – Radz

+1

Pas d'alignement. Largeur. –