Perché il Perl non stampa l'ultimo testo prima che esca?
Domanda
Il mio codice non eseguirà l'ultima riga subito prima di " exit;
" e non ho idea del perché. Ho provato a mettere una riga aggiuntiva printf $ fh
prima di exit
, ma non ha funzionato neanche; non stamperebbe nessuna riga. Tutto il resto stampa bene tranne le ultime dichiarazioni di stampa prima dell'uscita.
Qualche idea sul perché questo accada? O meglio ancora, come risolverlo o aggirarlo?
if($i>0 && $i<3)
{
printf $fh "Partial match found.\n";
if($matched_uid){printf $fh "UID #: ".$arguid." exists.\n";}
if($matched_id){printf $fh "ID #: ".$argid." exists.\n";}
if($matched_uname){printf $fh "Username: ".$arguname." exists.\n";}
printf $fh "Aborting.";
exit;
}
EDIT:
Parte del codice che ho copiato conteneva questo
select $fh; $| = 1; #set auto flush
Forse è per questo che i miei risultati non possono essere duplicati ....
Soluzione
Prova " Aborting. \ n "
Sembra un problema di buffering.
Altri suggerimenti
Ho dato R. Bemrose il mio voto, ma se $ fh è un FILE HANDLE potresti anche volerlo chiudere
prima di terminare.
Inoltre, stai usando printf
in modo errato. printf è non 'stampa file'. il suo "formato di stampa".
Per l'ultimo esempio
print $fh 'Message' ;
È tutto ciò di cui hai bisogno.
printf
deve essere utilizzato in questo modo:
printf $fh 'some format %s and more %s ' , $var , $var ;
o
printf 'some format %s and more %s ' , $var , $var ;
e la sua propensione al fare
print $fh sprintf 'format %s more %s' , $var , $var ;
E per questo motivo, stai mettendo inutili rischi di codice nel caso in cui una qualsiasi delle tue variabili concatenate si espanda per avere '%' in esse. Per un esempio di persone che cadono in questa trappola, vedi Q : 308417: Perché il mio script Perl rimuove i caratteri dal file?
perldoc -f print
print FILEHANDLE LIST print LIST print Prints a string or a list of strings.
perldoc -f printf
printf FILEHANDLE FORMAT, LIST printf FORMAT, LIST Equivalent to "print FILEHANDLE sprintf(FORMAT, LIST)", except that "$\" (the output record separator) is not appended
Ulteriori sondaggi
Ho esaminato ulteriormente il tuo problema perché non riesco a ottenere il tuo "buffering" condizione da verificarsi. Tutti i miei file sono correttamente scaricati indipendentemente dal fatto che li scarichi o meno. (Perl 5.10).
Ecco il mio frammento di codice che sto provando:
#!/usr/bin/perl
use strict;
use warnings;
open my $fh , '>' , '/tmp/oo.txt';
my $exit_at = int(rand( 200_000 ));
print "$exit_at\n";
sleep 2;
for ( 0 .. ( $exit_at * 2 ) ){
print $fh Ho dato R. Bemrose il mio voto, ma se $ fh è un FILE HANDLE potresti anche volerlo chiudere
prima di terminare.
Inoltre, stai usando printf
in modo errato. printf è non 'stampa file'. il suo "formato di stampa".
Per l'ultimo esempio
print $fh 'Message' ;
È tutto ciò di cui hai bisogno.
printf
deve essere utilizzato in questo modo:
printf $fh 'some format %s and more %s ' , $var , $var ;
o
printf 'some format %s and more %s ' , $var , $var ;
e la sua propensione al fare
print $fh sprintf 'format %s more %s' , $var , $var ;
E per questo motivo, stai mettendo inutili rischi di codice nel caso in cui una qualsiasi delle tue variabili concatenate si espanda per avere '%' in esse. Per un esempio di persone che cadono in questa trappola, vedi Q : 308417: Perché il mio script Perl rimuove i caratteri dal file?
perldoc -f print
print FILEHANDLE LIST
print LIST
print Prints a string or a list of strings.
perldoc -f printf
printf FILEHANDLE FORMAT, LIST
printf FORMAT, LIST
Equivalent to "print FILEHANDLE sprintf(FORMAT, LIST)", except that "$\"
(the output record separator) is not appended
Ulteriori sondaggi
Ho esaminato ulteriormente il tuo problema perché non riesco a ottenere il tuo "buffering" condizione da verificarsi. Tutti i miei file sono correttamente scaricati indipendentemente dal fatto che li scarichi o meno. (Perl 5.10).
Ecco il mio frammento di codice che sto provando:
Modification of a read-only value attempted at iotest.pl line 15.
Sto usando il tuo miss-use di printf.
La riga che viene commentata espelle un messaggio di errore, perché non è valida a causa della mancata fornitura del parametro 'n' e muore con:
<*>
Prima di eseguire la stampa dell'ultima riga (anch'essa non valida, ma non ci sono simboli% in questo modo va bene) rendendo 'ultima riga' assente dal file di output.
Correggi il tuo printf e usa invece la vecchia stampa e vedi se questo risolve il tuo problema.
;
if ( Ho dato R. Bemrose il mio voto, ma se $ fh è un FILE HANDLE potresti anche volerlo chiudere
prima di terminare.
Inoltre, stai usando printf
in modo errato. printf è non 'stampa file'. il suo "formato di stampa".
Per l'ultimo esempio
print $fh 'Message' ;
È tutto ciò di cui hai bisogno.
printf
deve essere utilizzato in questo modo:
printf $fh 'some format %s and more %s ' , $var , $var ;
o
printf 'some format %s and more %s ' , $var , $var ;
e la sua propensione al fare
print $fh sprintf 'format %s more %s' , $var , $var ;
E per questo motivo, stai mettendo inutili rischi di codice nel caso in cui una qualsiasi delle tue variabili concatenate si espanda per avere '%' in esse. Per un esempio di persone che cadono in questa trappola, vedi Q : 308417: Perché il mio script Perl rimuove i caratteri dal file?
perldoc -f print
print FILEHANDLE LIST
print LIST
print Prints a string or a list of strings.
perldoc -f printf
printf FILEHANDLE FORMAT, LIST
printf FORMAT, LIST
Equivalent to "print FILEHANDLE sprintf(FORMAT, LIST)", except that "$\"
(the output record separator) is not appended
Ulteriori sondaggi
Ho esaminato ulteriormente il tuo problema perché non riesco a ottenere il tuo "buffering" condizione da verificarsi. Tutti i miei file sono correttamente scaricati indipendentemente dal fatto che li scarichi o meno. (Perl 5.10).
Ecco il mio frammento di codice che sto provando:
<*>
Sto usando il tuo miss-use di printf.
La riga che viene commentata espelle un messaggio di errore, perché non è valida a causa della mancata fornitura del parametro 'n' e muore con:
<*>
Prima di eseguire la stampa dell'ultima riga (anch'essa non valida, ma non ci sono simboli% in questo modo va bene) rendendo 'ultima riga' assente dal file di output.
Correggi il tuo printf e usa invece la vecchia stampa e vedi se questo risolve il tuo problema.
== $exit_at ){
printf $fh '%n' ; # Bad Code Causes Early Death.
printf $fh 'last line';
exit;
}
if ( Ho dato R. Bemrose il mio voto, ma se $ fh è un FILE HANDLE potresti anche volerlo chiudere
prima di terminare.
Inoltre, stai usando printf
in modo errato. printf è non 'stampa file'. il suo "formato di stampa".
Per l'ultimo esempio
print $fh 'Message' ;
È tutto ciò di cui hai bisogno.
printf
deve essere utilizzato in questo modo:
printf $fh 'some format %s and more %s ' , $var , $var ;
o
printf 'some format %s and more %s ' , $var , $var ;
e la sua propensione al fare
print $fh sprintf 'format %s more %s' , $var , $var ;
E per questo motivo, stai mettendo inutili rischi di codice nel caso in cui una qualsiasi delle tue variabili concatenate si espanda per avere '%' in esse. Per un esempio di persone che cadono in questa trappola, vedi Q : 308417: Perché il mio script Perl rimuove i caratteri dal file?
perldoc -f print
print FILEHANDLE LIST
print LIST
print Prints a string or a list of strings.
perldoc -f printf
printf FILEHANDLE FORMAT, LIST
printf FORMAT, LIST
Equivalent to "print FILEHANDLE sprintf(FORMAT, LIST)", except that "$\"
(the output record separator) is not appended
Ulteriori sondaggi
Ho esaminato ulteriormente il tuo problema perché non riesco a ottenere il tuo "buffering" condizione da verificarsi. Tutti i miei file sono correttamente scaricati indipendentemente dal fatto che li scarichi o meno. (Perl 5.10).
Ecco il mio frammento di codice che sto provando:
<*>
Sto usando il tuo miss-use di printf.
La riga che viene commentata espelle un messaggio di errore, perché non è valida a causa della mancata fornitura del parametro 'n' e muore con:
<*>
Prima di eseguire la stampa dell'ultima riga (anch'essa non valida, ma non ci sono simboli% in questo modo va bene) rendendo 'ultima riga' assente dal file di output.
Correggi il tuo printf e usa invece la vecchia stampa e vedi se questo risolve il tuo problema.
% 1000 ){
print $fh "\n";
}
}
Sto usando il tuo miss-use di printf. La riga che viene commentata espelle un messaggio di errore, perché non è valida a causa della mancata fornitura del parametro 'n' e muore con:
<*>Prima di eseguire la stampa dell'ultima riga (anch'essa non valida, ma non ci sono simboli% in questo modo va bene) rendendo 'ultima riga' assente dal file di output.
Correggi il tuo printf e usa invece la vecchia stampa e vedi se questo risolve il tuo problema.
Perl bufferizza il suo output. Puoi disattivare il buffering automatico con
local $| = 1;
Modifica: in qualche modo ho colpito! invece di | la prima volta ... risolto. Non ho idea di come sia successo, sono sui lati opposti della tastiera.
In tema di uso corretto di print
, rendi le cose un po 'difficili con te stesso.
Interpola le tue variabili invece di concatenare le stringhe insieme. Utilizzare un'istruzione print con un elenco di stringhe da stampare, anziché più stringhe.
Ecco un modo:
if( $i>0 && $i<3 )
{
print $fh join "\n",
"Partial match found.",
$matched_uid ? "UID #: $arguid exists." : (),
$matched_id ? "ID #: $argid exists." : (),
$matched_uname ? "Username: $arguname exists." : (),
"Aborting.",
;
exit;
}
Il ()
sul lato falso dell'operatore ternario è un elenco vuoto, che scompare quando gli argomenti da unire vengono appiattiti. Se avessi usato e vuoto la stringa ( ''
), ogni criterio non corrispondente avrebbe prodotto una riga vuota in più nei risultati.
Puoi anche aggiungere la tua nuova riga su ogni elemento, quindi saltare il join, se ritieni che sia più leggibile:
print $fh
"Partial match found.\n",
$matched_uid ? "UID #: $arguid exists.\n" : '',
...
Devi aggiungere un finale \ n all'ultima stampa. In caso contrario, l'output non viene scaricato nella console.
O David Norman ha ragione, o il problema è altrove. Ho appena digitato il codice all'interno del blocco if nell'interprete perl e ha stampato "Aborting". come previsto. (Ha funzionato per me anche senza il carattere di fine riga finale.)