2010-07-13 5 views
3

Je veux effectuer une tâche lorsque le fichier n'est pas ouvert dans le programme Perl ci-dessous. Mais quand je l'exécute, j'obtiens des erreurs de syntaxe. Qu'est ce qui ne va pas avec ça?perl ouvrir le fichier de gestion des erreurs

my $LOGPATH = $ENV{DATA_OU}; 
my $LOGFILE = "cdj_rep" . "." . "test" . ".rpt"; 

if ! (open(OUT,">$LOGPATH/test1/work/$LOGFILE")) { 
    print "testin"; 
    return; 
} 

close(OUT); 

Répondre

9

Le! doit aller à l'intérieur des supports:

if (! open (out, 
+0

Merci beaucoup pour l'info – Arav

11

J'écrirait comme

my $LOGPATH = $ENV{DATA_OU}; 
my $LOGFILE = "cdj_rep.test.rpt"; 
my $path = "$LOGPATH/test1/work/$LOGFILE"; 

open my $fh, ">", $path or do { 
    warn "$0: open $path: $!"; 
    return; 
}; 

close $fh or warn "$0: close $path: $!"; 

Placez le chemin complet dans $path de sorte que vous n'avez pas à le répéter plusieurs fois, et si vous avez besoin pour le changer, vous pouvez le faire en un seul endroit.

L'appel à open utilise un descripteur de fichier lexical (my $fh) plutôt qu'un handle bareword. C'est une bonne habitude à développer car le passage aux sous-marins ou le bourrage à l'intérieur des structures de données a tendance à être plus naturel sur le plan syntaxique.

Il utilise également la forme à 3 arguments de open afin que vous n'ayez pas à vous soucier des caractères du chemin interprétés spécialement. Cela peut ne pas sembler un gros problème dans le contexte de votre code, mais c'est une autre bonne habitude à développer.

Un idiome commun pour vérifier si une open est acceptée est

open my $fh, "<", $path 
    or die "$0: open $path: $!"; 

En utilisant if (!open ... ou unless (open ... serait bien, mais avec un descripteur de fichier lexical, vous devez vous soucier des problèmes de la portée. Vous semblez utiliser le contrôle comme un garde, donc l'écriture open or ... laisse le handle de fichier dans la portée pour quand il réussit. Vous voulez que deux instructions soient exécutées si elles échouent, vous devez donc les placer dans do { ... } comme ci-dessus.

Notez également le contenu du message d'erreur est passé à warn:

  • le programme qui avait une erreur ($0)
  • ce qu'il essayait de faire (open $path)
  • et pourquoi il a échoué ($!)

Les warn et die opérateurs envoient leur SORT ut à l'erreur standard, ce qui permet la flexibilité de rediriger les messages d'erreur ailleurs.

Enfin, lorsque vous close gérer un fichier que vous avez créé pour écrire ou ajouter, vous devez vérifier s'il échoue, ce qui peut arriver si une erreur d'E/S s'est produite, par exemple.

+2

Schwern dit que nous devrions utiliser 'autodie'. –

+1

+1: recommandation bien écrite pour les nouvelles techniques d'ouverture de Perl. – dawg

+0

Merci d'avoir allumé plus de 0 $ et $! variables intégrées. Très utile pour les débutants comme moi. En outre, n'est-ce pas une convention d'utiliser majuscules FILE_HANDLES? –