2016-07-19 1 views
0

Je couraisperl pour imprimer en notation non scientifique

./script.pl 69032 text.txt 

Où text.txt contient

1 29 239 6 

Et je reçois

1 29 239 8.69162127708889e-05 

En sortie, mais je veux juste le dernier numéro à être

1 29 239 .0000869162127708889 

C'est mon script

$percent=$ARGV[0]; 
shift; 
while(<>){ 
     my $temp = $_; 
     my ($num, $start, $stop, $exp) = split("\t", $temp); 
     if(defined($exp)){ 
       print $num,"\t",$start,"\t",$stop,"\t",$exp/$percent,"\n"; 
     } 
} 
+3

Regardez [sprintf] (http://perldoc.perl.org/functions/sprintf.html). –

Répondre

4

Utilisation printf pour l'impression en forme. Les détails des spécificateurs de format sont donnés en sprintf.

printf("%d\t%d\t%d\t%10.8f\n", $num, $start, $stop, $exp/$percent); 

La chaîne à l'intérieur de "..." est l'endroit où vous spécifiez comment formater. Le reste est une liste de variables qui sont utilisées dans la chaîne pour chaque spécificateur %, en général dans l'ordre où elles viennent. Le sprintf renvoie une chaîne, tandis que printf imprime à STDOUT ou à un autre handle de fichier s'il est le premier argument, printf($fh "...", @vars). C'est l'un des plus vieux outils les plus vénérables.

-dessus on a: un nombre entier %d, puis un onglet \t, les mêmes deux fois de plus, puis un nombre à virgule flottante devant être imprimées dans le domaine de la largeur totale 10 (y compris le point décimal et un signe possible) avec 8 chiffres après le point. Les entiers prennent autant d'espace dans la sortie dont ils ont besoin - un pour 1, trois pour 239. Si vous voulez aligner la sortie, vous pouvez spécifier la largeur minimale du champ

printf("%3d\t%3d\t%3d\t%10.8f\n", $num, $start, $stop, $exp/$percent); 

Maintenant, chaque entier prendra trois espaces, alignés à droite. Pour aligner sur la gauche, utilisez %-3d. Pour avoir des zéros en tête, vous diriez %03d, pour 001. Les chaînes peuvent être imprimées dans les champs à largeur fixe, ainsi, si

printf("%4s %6s %6s %12s\n", qw(num start stop factor)); 
printf("%4d %6d %6d %12.8f\n", $num, $start, $stop, $exp/$percent); 

impressions

 
num start stop  factor 
    1  29 239 0.00008692 

Au-dessus j'ai choisi largeurs de champ pour un aménagement intérieur confortable et utilisé des espaces littéraux comme séparateurs entre eux. (Les onglets peuvent perturber l'alignement visuel si les entrées ne rentrent pas dans les tabulations.Ce qui n'a aucun effet sur l'analyse ultérieure si cela va à un fichier de données, même si elles ne sont pas non plus utiles pour l'analyse.) fait un fichier CSV.

Il y a beaucoup, beaucoup plus qu'on peut faire avec ceci. Il est utilisé pour tout, depuis les conversions de format précises en passant par l'impression de fichiers de données ou de rapports ASCII (décents). La page sprintf est détaillée avec beaucoup d'exemples.

+0

Vous avez besoin de guillemets autour de vos chaînes de format – Borodin

+0

@Borodin Merci beaucoup. Je travaille beaucoup avec matlab ces jours-ci ... ça m'a juste tiré dessus (ce n'était pas moi). La même syntaxe pour (f) printf, eh bien, sauf que ce n'est pas tout à fait. Erreurs très ennuyantes. Je vous remercie. – zdim