2011-08-30 1 views
2

J'essaie d'imprimer la sortie au format tabulaire.sortie de la table d'impression Perl

mon script:

use strict; 
my @heading=("FN","SN","BP","SUBBN","LgcBT"); 
my @values=("1","0","Front","Mother Board","MIU"); 
print "\n\n"; 
&HEADING; 
print "\n"; 
&VALUES; 
print "\n\n"; 

sub HEADING { 
    foreach (@heading) { 
     my $lgth1=length($_); 
     printf "%3s","| "; 
     printf "%${lgth1}s",$_; 
    } 
} 

sub VALUES { 
    foreach (@values) { 
     my $lgth2=length($_); 
     printf "%3s","| "; 
     printf "%${lgth2}s",$_; 
    } 
} 

Sortie:

| FN | SN | BP | **SUBBN** | LgcBT 

| 1 | 0 | Front | **Mother Board** | MIU 

J'ai besoin d'imprimer la sortie d'une manière que si la valeur est plus longue que la position, puis il ajuste automatiquement la longueur de la position à celle de la valeur .

Répondre

0

La façon de le faire est de générer un tableau de longueur à l'avance:

my @lengths; 
for (0..$#lengths) { 
    $lengths[$_] = (length($headers[$_]) > length($values[$_])) ? length($headers[$_]) : length($values[$_]) 
} 

Bien sûr, il y a de meilleures façons de générer @lengths qui sont plus Perl-ish, mais à mon humble cet exemple est le plus facile lire.

+0

Bonjour Nathan, Merci pour le code. Depuis que je suis en réseau mec pouvez-vous élaborer plus comment puis-je utiliser le code fourni dans mon script existant qui est dans la publication initiale .... désolé pour le problème ... – Mahesh

+0

@Mahesh: après avoir généré le tableau '@ longueurs ' , utilisez simplement cela au lieu de '3' dans'% 3s' et au lieu de '$ {lgth2}' et '$ {lgth1}'. –

+1

Oh mon dieu nathan ... c'est vraiment incroyable ... merci beaucoup ..... Ça marche ... Cordialement: Mahesh – Mahesh

4

Il y a un certain nombre de modules pour les tables de texte « jolie impression »; mon préféré est Text::ASCIITable.

+0

N.B. La suggestion de Quentin utilise le vôtre comme un backend –

+0

C'est bon à savoir - sonne comme Data :: Format est une solution plus flexible. – rjh