2017-09-26 2 views
5

Comment puis-je comprendre l'utilisation suivante de la fonction open() dans Perl File I/O?Quelle est la signification du point dans cette utilisation open() en Perl?

open(FHANDLE, ">" . $file) 

J'ai essayé de trouver ce type de syntaxe in the docs mais n'a pas trouvé; s'il vous plaît noter qu'il y a un. (point) après ">". Tout ce que je ne peux pas comprendre est une utilisation de point, le reste que je connais.

+0

https://perldoc.perl.org/perlop.html#Additive-Operators –

Répondre

12

Ceci est un exemple de l'ancienne forme à deux arguments de open (ce qui devrait être évité maintenant que trois arguments open est disponible). En Perl, . est l'opérateur d'ajout. Il combine les deux chaînes en une seule chaîne.

La ligne de code que vous avez affichée est équivalente à open(FHANDLE, ">$file"), elle utilise simplement une méthode différente pour combiner les > et $file.

La meilleure façon de le faire ces jours-ci serait open(my $fhandle, '>', $file), comme indiqué dans la documentation à laquelle vous avez lié.

8

Il s'agit du paramètre à deux arguments open. Le point . est l'opérateur de concaténation de chaîne dans Perl. Si open est appelée avec deux arguments, le deuxième argument contient à la fois le mode et le chemin.

Dans votre cas, il ouvrira le fichier nommé au $file pour l'écriture.

Cependant, pour plusieurs raisons, vous ne devriez pas faire cela. Il est plus courant d'utiliser les trois-arguments-open et les handles de fichiers lexicaux à la place du handle de fichier global GLOB. Le handle de fichier lexical s'assure que Perl ferme implicitement le handel dès qu'il est hors de portée. L'utilisation d'arguments différents pour le mode et le nom de fichier est un problème de sécurité, car sinon un utilisateur mal intentionné pourrait passer en mode de changement - le nom de fichier change.

open my $fh, '>', $file or die $!; 

en plus du DESCRIPTEUR maintenant lexical et la séparation du mode et le nom du fichier, nous vérifions aussi les erreurs dans ce code, ce qui est toujours une bonne idée.