2016-07-19 15 views
0

in nicht wissenschaftliche Schreibweise drucken Ich bin mitErste perl

./script.pl 69032 text.txt 

Wo text.txt enthält

1 29 239 6 

Und ich bin immer

1 29 239 8.69162127708889e-05 

Als Ausgabe aber ich will nur die letzte Nummer ist

1 29 239 .0000869162127708889 

Das ist mein Skript

$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

Werfen Sie einen Blick auf [sprintf] (http://perldoc.perl.org/functions/sprintf.html). –

Antwort

4

Verwenden printf für formatierte Druck. Die Details der Formatspezifizierer sind in sprintf angegeben.

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

Die Zeichenfolge innerhalb "..." ist, wo Sie angeben, wie formatiert wird. Der Rest ist eine Liste von Variablen, die in der Zeichenfolge für jeden Spezifizierer % verwendet werden, im Allgemeinen in der Reihenfolge, in der sie kommen. Die sprintf gibt eine Zeichenfolge zurück, während printf auf STDOUT oder zu einem anderen Dateihandle druckt, wenn es als das erste Argument printf($fh "...", @vars) angegeben wird. Dies ist eines der ehrwürdigsten, guten alten Werkzeuge.

Above haben wir: eine ganze Zahl %d, dann eine Lasche \t, dann werden die gleichen zwei mal mehr, dann eine Gleitkommazahl im Bereich der Gesamtbreite gedruckt werden 10 (einschließlich des Dezimalpunktes und ein mögliches Zeichen) mit 8 Ziffern nach dem Punkt. Die Ganzzahlen nehmen so viel Platz in der Ausgabe auf, wie sie benötigen - eine für 1, drei für 239. Wenn Sie die Ausgabe in einer Reihe aufstellen möchten, können Sie die minimale Breite des Feldes angeben

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

Jetzt jede ganze Zahl drei Räume nehmen, auf der rechten Seite ausgerichtet ist. Zum Ausrichten auf der linken Seite verwenden Sie %-3d. Um führende Nullen zu haben, würden Sie sagen %03d, für 001. Strings können auch in fester Breite Felder gedruckt werden, so

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

druckt

 
num start stop  factor 
    1  29 239 0.00008692 

Oben I Feldbreiten für einen komfortablen Layout gewählt und verwendet wörtliche Räume als Trennzeichen zwischen ihnen. (Registerkarten können sich mit visueller Ausrichtung anlegen, wenn Einträge nicht in Tabstopps passen. Was sich auf zukünftiges Parsen auswirkt, wenn dies in eine Datendatei geht, obwohl sie kein Zucker für die Analyse sind.) Wenn Sie stattdessen Kommas verwenden erstellt eine CSV-Datei.

Es gibt weit, viel mehr, was man damit tun kann. Es wird für alles verwendet, von präzisen Formatkonvertierungen bis hin zum Drucken von Datendateien oder anständigen (ASCII-) Berichten. Die sprintf Seite wird mit vielen Beispielen ausführlich beschrieben.

+0

Sie benötigen doppelte Anführungszeichen um Ihre Formatzeichenfolgen – Borodin

+0

@Borodin Vielen Dank. Ich arbeite viel mit Matlab in diesen Tagen ... es zog mich nur (es war nicht ich). Die gleiche Syntax für (f) printf, naja, nur dass es nicht ganz so ist. Sehr ärgerliche Fehler. Vielen Dank. – zdim

Verwandte Themen