Io di solito un ciclo tra le linee in un file utilizzando il seguente codice:Qual è il modo più difensivo per scorrere le righe in un file con Perl?
open my $fh, '<', $file or die "Could not open file $file for reading: $!\n";
while (my $line = <$fh>) {
...
}
Tuttavia, in answering another question, Evan Carroll modificato la mia risposta, cambiando il mio while
dichiarazione:
while (defined(my $line = <$fh>)) {
...
}
La sua logica era che se si avere una linea che è 0
(dovrebbe essere l'ultima riga, altrimenti avrebbe un ritorno a capo) quindi il tuo while
uscirebbe prematuramente se hai usato la mia dichiarazione ($line
sarebbe impostato su "0"
e il valore restituito dall'assegnazione sarebbe quindi "0"
che viene valutato su falso). Se controlli la definizione, non ti imbatti in questo problema. Ha perfettamente senso.
Quindi l'ho provato. Ho creato un file di testo la cui ultima riga è 0
senza alcun ritorno a capo su di esso. L'ho passato attraverso il mio ciclo e il ciclo non si è interrotto prematuramente.
Poi ho pensato, "Aha, forse il valore non è in realtà 0
, forse c'è qualcos'altro che sta rovinando tutto!" Così ho usato Dump()
da Devel::Peek
e questo è quello che mi ha dato:
SV = PV(0x635088) at 0x92f0e8
REFCNT = 1
FLAGS = (PADMY,POK,pPOK)
PV = 0X962600 "0"\0
CUR = 1
LEN = 80
che sembra dire a me che il valore è in realtà la stringa "0"
, mentre ottengo un risultato simile se chiamo Dump()
su un tipo scalare I' ve impostato esplicitamente su "0"
(l'unica differenza è nel campo LEN - dal file LEN è 80, mentre dal LEN scalare è 8).
Allora, qual è l'affare? Perché il mio ciclo while()
non si chiude prematuramente se si passa una linea che è solo "0"
senza ritorno a capo? Il loop di Evan è in realtà più difensivo, o Perl fa qualcosa di pazzo internamente che significa che non devi preoccuparti di queste cose e while()
in realtà esce solo quando colpisci eof
?
Se stai cercando di scrivere un codice difensivo, usa un [serbatoio] (http://en.wikipedia.org/wiki/Tank). –
Questo è il motivo per cui non modificherei il significato della risposta di qualcuno (correggo solo errori evidenti). Aggiungi un commento, se pensi che manchi qualcosa o che possa essere migliorato. E complimenti a te per aver indagato sugli interni! – Ether