2010-07-08 8 views
11

La seguente (non molto Perl-ish) CodiceCome si controlla il successo di open (file) in Perl?

#!/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 l'output come questo

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

Perché $ fh non equivale a false a seguito del bando di concorso? As mydir/ non esiste, mi aspetto che il tentativo di aprire il file fallisca.

Ottengo risultati simili se la directory e il file esistono, ma il file è di sola lettura.

Ho provato questo con Perl 5.10.1 su Windows 7 x64 e con Perl 5.10.0 su Fedora-11 Linux.

Immagino che il mio test di gestione dei file sia sbagliato. Ho provato a cercarlo su Google senza fortuna. Mi aspetto che sia ovvio, ma qualsiasi suggerimento o collegamento sarebbe molto apprezzato.

Grazie, Rob.

risposta

18

$fh non è impostato su un valore zero, è impostato su un GLOB come mostra il codice. Questo è diverso da quello che open rendimenti, che è il motivo per cui l'idioma è

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

o

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

Da perldoc:

open ritorna diverso da zero in caso di successo, il valore indefinito altrimenti.

un idioma spesso utilizzato è

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

Naturalmente si può fare qualcosa di diverso di una semplice die.

+0

Suggerimento aggiuntivo: usare 'perldoc -f open' per ottenere aiuto su una funzione integrata di Perl. – dolmen

13

open restituisce un valore diverso da zero in caso di esito positivo e un valore "falso" in caso di errore. Il linguaggio che stai cercando è

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

Se il primo argomento ($fh) non è definito (come in questo caso), open inizializza a qualche valore arbitrario (vedi Symbol::genysm method) prima tenta per aprire il file. Quindi $fh sarà sempre essere "true" anche se la chiamata open non riesce.

8

Oltre alle spiegazioni delle altre risposte:

Estrai il modulo autodie che viene fornito con perl 5.10.1 e versioni successive (ed è disponibile separatamente da CPAN).

Problemi correlati