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 ....

È stato utile?

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.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top