IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Don't use bareword filehandles


Sujet :

Langage Perl

  1. #1
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut Don't use bareword filehandles
    Définition de dictionnaire.phpmyvisites.net
    http://dictionnaire.phpmyvisites.net...word--7078.htm
    Définition du mot BAREWORD , Littéralement « mot nu ». En Perl, désigne un terme qui n'appartient pas au langage, ni n'est associé à une variable etc. Du point de vue du langage, il ne signifie rien.
    Je ne comprends pas bien. FILE est pourtant dans ce cas associé à $filename …
    Pourriez-vous me donner d'autres exemple de 'bareword'? Un nom de sous-programme en est également un non?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Open FILE, ‘<’, $filename
    	Or croak « Can’t open ‘$filename’ : $OS_ERROR »;
    Passage de ‘Perl Best Practices’, O’Reilly, chapter 10 : I/O, p202.
    Don’t use bareword filehandle
    Using a bareword like that as a filehandle causes Perl to store the corresponding input stream descriptor in the symbol table of the current package. Specifically, the stream descriptor is stored in the symbol table entry whose name is the same as the bareword; in this case, it’s *FILE. By using a bareword, the autor of the previous code is effectively using a package variable to store the filehandle.
    Donc Perl crée une table de symboles afin d’y stocker les ‘bareword’, pourriez-vous m’expliquer le fonctionnement. Comment doit-on correctement ouvrir un filehandle ? Est-ce uniquement par un filehandle indirect (comme expliqué au paragraphe suivant dans le livre).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Open my $FILE, ‘<’, $filename
    	Or croak « Can’t open ‘$filename’ : $OS_ERROR »;
    Merci beaucoup pour votre aide.
    -- Jasmine --

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    FILE n'est pas un mot clé du langage, et tu ne l'as pas mis entre guillemets, donc ce n'est pas une string. Sans "use strict", un tel mot isolé et sans sens particulier serait traité comme une string tout de même. Cela a pour effet de masquer des fautes de frappe dans des noms de fonctions ou autre problèmes du même genre, c'est pourquoi "strict" interdit les barewords, excepté dans open() ou avant un "=>".

    Dans open() si tu donnes une string en premier argument, il associe le filehandle au symbole correspondant dans la table de symbole. Cette façon de fonctionner a plein d'inconvénients : outre le fait que c'est une exception par rapport au reste du langage, les globs sont des variables globales, tu ne peux donc pas ouvrir deux filehandles du même noms en même temps sans en écraser un, ce qui peut avoir des conséquences imprévisibles, passer outre cette limitation exige une utilisation hautement non intuitive de local().
    Les filehandles lexicaux comparés à cela n'ont que des avantages, il sont locaux, ils se ferment automatiquement s'ils ne sont plus référencés, on peut utiliser des méthodes dessus qui donnent des noms plus clairs à des opérations obscures avec les globs, etc...

    Autrement dit cette recommandation est hautement recommandable et je la suit moi-même avec assiduité.

    --
    Jedaï

  3. #3
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Merci pour cette réponse bien claire.

    Citation Envoyé par Jedai
    Dans open() si tu donnes une string en premier argument, il associe le filehandle au symbole correspondant dans la table de symbole. Cette façon de fonctionner a plein d'inconvénients : outre le fait que c'est une exception par rapport au reste du langage, les globs sont des variables globales, tu ne peux donc pas ouvrir deux filehandles du même noms en même temps sans en écraser un
    Le bareword FILE dans open FILE ... est donc un "glob"? Quelle est la définition d'un glob? La fonction glob a-t'elle un lien avec cela?

    Merci
    -- Jasmine --

  4. #4
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par Jasmine80 Voir le message
    Le bareword FILE dans open FILE ... est donc un "glob"? Quelle est la définition d'un glob? La fonction glob a-t'elle un lien avec cela?
    Non non, open affecte juste le filehandle au glob qui porte le nom donné par la string (bareword) en premier paramètre. Et quand je parle de glob, je parle de typeglob. Pour mieux comprendre le sujet, un peu d'aide sur la notion de tables de symboles est utile.

    Mais tout cela est relativement obscur et pas utile de toute façon si tu prends la très bonne habitude d'utiliser les filehandle lexicaux partout. On en est à la 5.10 après tout (maintenant installé par défaut dans Ubuntu 5.10 et dérivés, bonne nouvelle !).

    --
    Jedaï

  5. #5
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Citation Envoyé par perldata
    Typeglobs and Filehandles

    Perl uses an internal type called a typeglob to hold an entire symbol table entry. The type prefix of a typeglob is a * , because it represents all types.
    Ah mais oui, ça rejoint la citation de "Perl Best Practice" citée dans mon premier message. Je comprends vaguement mais comme tu dis l'important est de l'appliquer et pas de comprendre en détails.


    Merci pour ton aide.
    -- Jasmine --

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. use case pour gestion des dons d'une association
    Par daroum88 dans le forum Cas d'utilisation
    Réponses: 1
    Dernier message: 09/01/2014, 12h55
  2. Réponses: 0
    Dernier message: 15/10/2010, 14h25
  3. Réponses: 2
    Dernier message: 25/06/2009, 15h05
  4. Bareword not allowed while "strict subs" in use at
    Par MohEllayali dans le forum Langage
    Réponses: 0
    Dernier message: 09/05/2009, 18h12
  5. Connaitre l'unitée à ajouter dans USES
    Par DelphiCool dans le forum Langage
    Réponses: 7
    Dernier message: 01/08/2002, 13h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo