2010-07-08 6 views
11

(no muy Perl-ish) siguiente código¿Cómo se verifica el éxito de abrir (archivo) en Perl? El

#!/usr/bin/perl 

if (! -e "mydir/") 
{ 
    print "directory doesn't exist.\n"; 
} 
open (my $fh, ">", "mydir/file.txt"); 
if ($fh) 
{ 
    print "file opened.\n"; 
    print $fh; 
    print $fh "some text\n" or die "failed to write to file.\n"; 
    close ($fh); 
} 
else 
{ 
    print "failed to open file.\n"; 
} 

produce la salida como este

directory doesn't exist. 
file opened. 
failed to write to file. 
GLOB(0x...some-hex-digits...) 

¿Por qué es $ fh no es equivalente a la falsa después de la llamada abierta? Como mydir/ no existe, esperaría que el intento de abrir el archivo fallara.

Obtengo resultados similares si el directorio y el archivo existen, pero el archivo es de solo lectura.

He intentado esto con Perl 5.10.1 en Windows 7 x64, y con Perl 5.10.0 en Fedora-11 Linux.

Supongo que la prueba de manejo de archivo es incorrecta. He intentado buscar en Google esto sin suerte. Espero que sea algo obvio, pero cualquier sugerencia o enlace sería muy apreciado.

Gracias, Rob.

Respuesta

18

$fh no se establece en un valor cero, se establece en GLOB como muestra el código. Esto es diferente de lo que open retornos por lo que el modismo es

open(...) or die ... ; 

o

unless(open(...)) { 
    ... 
} 
9

De perldoc:

abierto devuelve distinto de cero en caso de éxito, el valor no definido de otra manera.

Un modismo es a menudo utilizado

open my $fh, '<', $filename or die $!; 

Por supuesto se puede hacer algo más que simplemente die.

+0

Consejo adicional: use 'perldoc -f open' para obtener ayuda sobre una función incorporada de Perl. – dolmen

13

open devuelve un valor distinto de cero en caso de éxito y un valor "falso" en caso de error. El lenguaje que busca es

if (open my $fh, '>', $file) { 
    # open was successful 
} else { 
    # open failed - handle error 
} 

Si no está definido el primer argumento ($fh) (como lo es en este caso), open lo inicializará a algún valor arbitrario (véase la Symbol::genysm method) antes intenta para abrir el archivo Por lo tanto, $fh será siempre ser "verdadero" incluso si falla la llamada open.

8

Además de las explicaciones en las otras respuestas:

Salida del módulo autodie que viene con perl 5.10.1 y superior (y está disponible por separado de CPAN).

Cuestiones relacionadas