Comment puis-je résoudre un “print() de fermeture descripteur de fichier” erreur en Perl?
J'obtiens ce message d'erreur lors de l'exécution de mon script Perl. S'il vous plaît, dites-moi comment faire pour rectifier cette erreur en Perl.
print() on closed filehandle MYFILE
C'est le code qui est de donner le message d'erreur:
sub return_error
{
$DATA= "Sorry this page is corrently being updated...<p>";
$DATA.= "<A href=\"javascript:history.go(-1)\"> Back </A>";
open(MYFILE,">/home/abc/xrt/sdf/news/top.html");
print MYFILE $DATA;
close(MYFILE);
exit;
}
J'espère que maintenant je suis plus claire.
Le titre du poste doit être édité. Il semble que si elle est une "erreur en Perl'!
ce serait pratique si perl est l'avertissement "print() de fermeture descripteur de fichier" message également suggéré de vérifier le descripteur de fichier peut être ouvert ou pas
ce serait pratique si perl est l'avertissement "print() de fermeture descripteur de fichier" message également suggéré de vérifier le descripteur de fichier peut être ouvert ou pas
OriginalL'auteur | 2009-05-30
Vous devez vous connecter pour publier un commentaire.
Vous voulez faire un peu d'action sur
MYFILE
après vous (ou l'interprète lui-même en raison d'une erreur) fermé.Selon votre exemple de code, le problème pourrait être que
open
n'a pas vraiment d'ouvrir le fichier, le script peut n'avez pas la permission d'écrire dans le fichier.Modifier votre code à la suite pour voir si il y a une erreur:
Mise à jour
ysth a souligné que
-w
n'est pas vraiment bon à vérifier si vous pouvez écrire dans le fichier, ne vérifie que l'un des indicateurs pertinents dans le mode set". En outre, brian d foy m'a dit que la condition que j'ai utilisé n'est pas bon à la gestion de l'erreur. J'ai donc enlevé le caractère trompeur de ce code. Utilisez le code ci-dessus à la place.merci, Brad est juste corrigé 🙂
-w ne permet pas de vérifier que vous pouvez écrire dans le fichier, il vérifie que l'un des indicateurs pertinents dans le mode est réglé. Cela peut produire des faux positifs et des faux négatifs. Vous êtes beaucoup mieux d'essayer de l'ouvrir pour l'écriture et la détection d'une erreur ouverts.
Où est-ce si-sinon meme en venir? Que fait-on espérer $! pour être dans ce bloc else? C'est certainement rien à voir avec l'ouvrir.
merci pour vos commentaires. J'ai mis à jour ma réponse à refléter vos remarques. Ça fait un moment que je ne pas utiliser Perl régulièrement, désolé pour les erreurs.
OriginalL'auteur Török Gábor
Il semble que la
open
appel est un échec. Vous devriez toujours vérifier l'état lors de l'ouverture d'un descripteur de fichier.Si l'ouverture échoue, intégré dans la variable $! (un.k.un. $OS_ERROR) contiennent les OS-depededant message d'erreur, par exemple "Permission denied"
Il est aussi préférable (pour les non-archaïque versions de Perl) pour utiliser les trois-argument forme de
open
et lexicales descripteurs:print {$fh} $DATA
pour l'impression de descripteurs. Il semble tout à fait inacceptable.OriginalL'auteur Michael Carman
Une solution de rechange à dire
or die
est d'utiliser le autodie pragma:Le code ci-dessus génère l'erreur suivante (sauf si un fichier nommé nsdfkjwefnbwef existe dans le répertoire courant):
OriginalL'auteur Chas. Owens
Vérifier que l'travaillé
OriginalL'auteur hpavc
Ce:
Dans moderne Perl, il peut être écrite comme:
Cette façon, vous obtenez $variable restreint le champ d'application, il n'y a pas de "funky business" si vous avez bizarre les noms de fichiers (par exemple, commencer avec ">") et la gestion des erreurs (vous pouvez remplacer mourir de mettre en garde ou avec le code de gestion d'erreur).
Une fois que vous fermez $file_fh ou tout simplement hors de portée, vous ne pouvez plus l'utiliser pour l'impression.
OriginalL'auteur nxadm
J'ai eu ce problème lors de mes fichiers ont été mis en LECTURE SEULE.
Vérifier cela aussi, avant d'abandonner! 🙂
OriginalL'auteur Chris Snow
Si vous utilisez un symbole mondial MYFILE comme votre descripteur de fichier, plutôt que d'un local lexicale ($monfichier), vous toujours de rencontrer des problèmes si votre programme est multithread, par exemple si elle est en cours d'exécution via mod_perl. Un processus peut être de fermer le descripteur de fichier alors qu'un autre processus tente d'écrire. À l'aide de $monfichier permettra d'éviter ce problème chaque fois qu'une instance aura sa propre copie locale, mais vous serez toujours à courir dans des questions où un processus peut écraser les données, l'autre qui est écrit. Utiliser la fonction flock() pour verrouiller le fichier lors de l'écriture.
OriginalL'auteur Ether
Quelque part vous êtes script, vous allez être en train de faire quelque chose comme:
La dernière ligne provoquera une erreur parce que MYFILE a été fermé.
Mise à jour
Après avoir vu votre code, on dirait que le fichier que vous essayez d'écrire sur vous ne pouvez pas ouvrir en premier lieu. Comme d'autres l'ont déjà mentionné essayer de faire quelque chose comme:
Qui devrait vous donner quelques informations sur lesquelles vous ne pouvez pas ouvrir le fichier.
OriginalL'auteur Tom Jefferys