2010-07-08 4 views
11

ci-dessous (pas très Perl-ish) CodeComment vérifiez-vous le succès de l'ouverture (fichier) en 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"; 
} 

produit la sortie comme celle-ci

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

Pourquoi $ fh pas équivalente à faux suite à l'appel ouvert? Comme mydir/ n'existe pas, je m'attendrais à la tentative d'ouvrir le fichier à l'échec.

Je reçois des résultats similaires si le répertoire et le fichier existent, mais le fichier est en lecture seule.

J'ai essayé ceci avec Perl 5.10.1 sur Windows 7 x64, et avec Perl 5.10.0 sur Linux Fedora-11.

Je suppose que mon test de gestion de fichier est incorrect. J'ai essayé de googler ceci sans chance. Je m'attends à quelque chose d'évident, mais tous les conseils ou liens seraient très appréciés.

Merci, Rob.

Répondre

18

$fh n'est pas défini sur une valeur zéro-ish, il est défini sur GLOB comme le montre votre code. Ceci est différent de ce que open rendements qui est la raison pour laquelle l'idiome est

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

ou

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

De perldoc:

Ouvert retourne non nulle en cas de succès, la valeur définie autrement.

Un idiome souvent utilisé est

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

Bien sûr, vous pouvez faire autre chose que simplement die.

+0

Conseil supplémentaire: utilisez 'perldoc -f open' pour obtenir de l'aide sur une fonction intégrée Perl. – dolmen

13

open renvoie une valeur non nulle en cas de succès et une valeur "false" en cas d'échec. L'idiome que vous recherchez est

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

Si le premier argument ($fh) est indéfini (comme dans ce cas), open REINITIALISERA à une valeur arbitraire (voir le Symbol::genysm method) avant tente pour ouvrir le fichier. Donc $fh sera toujours être "vrai" même si l'appel open échoue.

8

En plus des explications dans les autres réponses:

Vérifiez le module autodie qui vient avec perl 5.10.1 et plus (et est disponible séparément du CPAN).

Questions connexes