PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : perl: variable platzhalter in print nach %



luxer
24-09-2007, 19:25
hy leute,

ich bastel gerade an nem kleinen perl skript für die uni und bin auf ein problem gestoßen:
und zwar benutze ich für meine konsolenausgaben beispielsweise folgende zeile:

printf"# Laufzeit $time %19c\n","35";

wobei $time eine zeit in sekunden ist.
Da ich die länge von $time nicht voraussagen kann hätte ich gern sowas wie:

$a=19-length($time);
printf"# Laufzeit $time % $a c\n","35"; oder
printf"# Laufzeit $time % 19-length($time)c\n","35";

geschrieben aber leider macht er nicht das gewünschte sondern gibt mir halt sachen wie:

Laufzeit 11729 % 19-length(11729)c

aus.

habt ihr vielleicht ne idee wie ich das gefixt bekomme ?

danke schonmal

Molaf
24-09-2007, 20:32
Hallo,
mit printf habe ich noch nicht viel gearbeitet (print hat mir bisher immer gereicht), aber einen Fehler sehe ich sofort:


printf"# Laufzeit $time % ",19-length($time),"c\n","35";


perl iteriert zwar die Variable in den String rein, aber die Formel muss ausserhalb stehen, daher den String schliessen und hinterher wieder für Text und \n öffnen.

Gruß
Molaf

BLUESCREEN3D
24-09-2007, 21:57
Wenn ich das richtig sehe, versuchst du die variable Breite von $time durch die Breite von der Raute am Ende auszugleichen?

printf ist doch gerade dazu da, sowas automatisch zu machen:

printf "# Laufzeit %-19s #\n", $time;

@Molaf: Das geht so nicht, weil bei printf der erste Parameter der Format-String ist und durch das Komma die Zahl nicht mehr zum ersten Parameter gehört.

luxer
24-09-2007, 22:01
hallo molaf,

danke für deine antwort.
leider funzt es auch so nich.

die neue ausgabe sieht so aus :
-1c (von der gesamten zeile)

jan61
24-09-2007, 23:13
...printf ist doch gerade dazu da, sowas automatisch zu machen:

printf "# Laufzeit %-19s #\n", $time;...

Zur Ergänzung: perldoc -f sprintf gibt eine Übersicht über die möglichen Formatanweisungen, perldoc -f printf zeigt die Aufrufsyntax von printf.

Nebenbei: Manchmal kann es durchaus nützlich sein, das Format erst zur Laufzeit zu bestimmen, z. B. wenn man in einer Listendarstellung die Ausgabebreite nach der Länge des größten Werts einer Werteliste ausrichten will. Da der Formatstring eben auch nur ein String ist, kann man das relativ einfach so machen:

jan@jack:~/.archiv/.images> perl -e '
> @zeiten=(1,666,12345,23,42);
> $max=0;
> foreach(@zeiten) {$max=length if $max<length}
> foreach(@zeiten) {printf "%".$max."s\n", $_}'
1
666
12345
23
42
Man beachte, dass der Formatstring durch Konkatenieren (.) und nicht durch Komma zusammengebaut wird, damit printf ihn als einen einzigen Parameter kriegt.

Jan

reneeb
25-09-2007, 08:22
Man kann dem Format auch einen Platzhalter für die Länge mitgeben:


#!/usr/bin/perl

use strict;
use warnings;

my $format = "%0*d\n";

for( 0..5 ){
print sprintf $format, $_, $_;
}

Das erste $_ ersetzt den Stern und gibt an, wie viele führende Nullen das zweite $_ haben soll...

Ausgabe:
0
1
02
003
0004
00005

luxer
25-09-2007, 13:37
ihr seit ja super, danke.

ich hab allerdings mittlerweile sowas hier geschrieben was es auch tut:
$to_be_left=60(max. zeilenbreite)-length("# Laufzeit $time#");
print "# Laufzeit $time "." "x $to_be_left."#\n";

aber nochmals danke für eure mühen