Come posso utilizzare sprintf per riempire a zero una lunghezza variabile in Perl?
Domanda
Voglio usare Perl sprintf per riempire a zero una variabile.
sprintf("%08d", $var);
Ma voglio determinare dinamicamente quante cifre riempire con zero.
Come faccio a sostituire l'"8" in sprintf("%08d", $var)
con una variabile chiamata $zerofill
?
Soluzione
Il primo argomento di sprintf è solo una stringa:
my $zerofill = 9;
my $number = 1000;
my $filled = sprintf "%0${zerofill}d", $number;
Si notino le parentesi graffe per impostare a parte il nome della variabile dal resto della stringa.
Abbiamo questo particolare problema come un esercizio un po 'intelligente nella Learning Perl per ricordare alla gente che le stringhe sono solo stringhe. :)
Tuttavia, come mobrule sottolinea nella sua risposta , sprintf ha molte caratteristiche per dare questo tipo di flessibilità. La documentazione per una funzione come apparentemente semplice è piuttosto lungo e ci sono un sacco di chicche in esso.
Altri suggerimenti
sprintf
e printf
sostenere la notazione *
(questo ha funzionato a partire almeno 5.8):
printf "%0*d", 9, 12345;
000012345
printf '$%*.*f', 8, 2, 456.78;
$ 456.78
Avevo bisogno di fare qualcosa di leggermente diverso:zero riempi un valore in virgola mobile e ottieni una lunghezza esatta.
Nel mio caso ho bisogno esattamente di 12 byte compreso il punto decimale.È leggermente più complicato di quello che hai sopra.Eccolo nel caso qualcuno ne avesse bisogno:
Supponiamo che $inputVal sia una stringa passata da qualche parte con un valore simile 1001.1.Tieni presente che, affinché funzioni in modo affidabile, dovrebbero essere inferiori a 12 caratteri
# This will give us extra zeros, but the string may be too long
my $floatVal = sprintf('%*.*f', 12, 12, $inputValue);
# This will remove any extra zeros
$result = substr($floatVal, 0, 12);