lo general bucle a través de líneas en un archivo utilizando el siguiente código:¿Cuál es la forma más defensiva de recorrer líneas en un archivo con Perl?
open my $fh, '<', $file or die "Could not open file $file for reading: $!\n";
while (my $line = <$fh>) {
...
}
Sin embargo, in answering another question, Evan Carroll editado mi respuesta, cambiar mi declaración while
a:
while (defined(my $line = <$fh>)) {
...
}
Su razonamiento era que si tiene una línea que es 0
(tendría que ser la última línea, de lo contrario tendría un retorno de carro) entonces su while
se cerraría prematuramente si usara mi extracto ($line
se establecería en "0"
, y el valor de retorno de la asignación también sería "0"
que se evalúa como falso). Si comprueba la definición, entonces no se encontrará con este problema. Tiene perfecto sentido.
Así que lo probé. Creé un archivo de texto cuya última línea es 0
sin retorno de carro. Lo ejecuté a través de mi loop y el loop no salió prematuramente.
Pensé: "Aja, tal vez el valor no sea en realidad 0
, ¡tal vez hay algo más que está arruinando las cosas!" Así que utilicé Dump()
de Devel::Peek
y esto es lo que me dio:
SV = PV(0x635088) at 0x92f0e8
REFCNT = 1
FLAGS = (PADMY,POK,pPOK)
PV = 0X962600 "0"\0
CUR = 1
LEN = 80
que parece decirme que el valor es en realidad la cadena "0"
, como llegue a un resultado similar si llamo Dump()
en un escalar I' ve establecido explícitamente en "0"
(la única diferencia está en el campo LEN - del archivo LEN es 80, mientras que desde el escanero LEN es 8).
¿Cuál es el problema? ¿Por qué mi lazo while()
no sale prematuramente si le paso una línea que es solo "0"
sin retorno de carro? ¿Es el circuito de Evan realmente más defensivo, o Perl hace algo loco internamente, lo que significa que no tiene que preocuparse por estas cosas y while()
realmente solo sale cuando toca eof
?
Si está buscando escribir un código defensivo, use un [tanque] (http://en.wikipedia.org/wiki/Tank). –
Es por eso que no editaría el significado de la respuesta de alguien (solo corrijo errores tipográficos obvios). Agregue un comentario en su lugar si cree que falta algo o podría mejorarse. ¡Y felicitaciones a usted por investigar los aspectos internos! – Ether