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 :

Compréhension variable implicite


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France, Morbihan (Bretagne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 45
    Par défaut Compréhension variable implicite
    Bonjour à tous,

    j'ai une question qui tourne autour des variables implicites et peut-être leur portée.

    Pourquoi est-ce que le code suivant renvoie 'uninitialized value' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    use strict;
    $_ = '1 2 3 4 5 6';
    @_ = split;
    my $premier_elt = shift;
    print "$premier_elt\n";
    pour que ça marche, il suffit de remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $premier_elt = shift;
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $premier_elt = shift(@_);
    Pourquoi est-ce une erreur alors que cette tournure me parait classique. Par exemple, l'appel implicite à @_ ne pose pas de problème dans les sub {} :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sub ma_fonction {
      my $premier_arg = shift;
      etc...
    }

    merci d'avance

  2. #2
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    En l'absence de paramètre, shift prend pour paramètre implicite @_ lorsqu'il est dans une subroutine, mais il prend @ARGV en dehors.
    Ce comportement est décrit dans la documentation:

    If ARRAY is omitted, shifts the @_ array within the lexical scope of subroutines and formats, and the @ARGV array outside a subroutine...

  3. #3
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    CosmoKnacki a donné l'explication, elle est parfaitement correcte, je n'y reviens pas.

    Mais je te déconseille fortement d'affecter des valeurs aux variables $_ et @_, à moins de très bien savoir ce que tu fais, et encore, seulement dans des cas exceptionnels.

    Utilise tes propres variables, c'est bien plus sûr. En particulier, cette ligne:

    est dangereuse.

    Par exemple, en reprenant ton exemple, écris plutôt quelque chose de ce genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    use strict;
    my $str = '1 2 3 4 5 6';
    my @nums = split / /, $str;
    my $premier_elt = shift @nums;
    print "$premier_elt\n";
    ou même, si tu préfères:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    use strict;
    my $c = (split / /, '1 2 3 4 5')[0];
    print "$c\n";

Discussions similaires

  1. declaration des variables implicite
    Par tsumey dans le forum Fortran
    Réponses: 2
    Dernier message: 08/06/2016, 11h06
  2. Compréhension variable de type integer
    Par Zankyu dans le forum Fortran
    Réponses: 3
    Dernier message: 31/10/2014, 14h41
  3. variable avec accolades(compréhension du code)
    Par stephane543 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 18/08/2009, 00h38
  4. declaration implicite de variables
    Par Jcpan dans le forum Langage
    Réponses: 1
    Dernier message: 16/03/2009, 10h27
  5. Problème de compréhension sur variable %
    Par soso78 dans le forum VB.NET
    Réponses: 15
    Dernier message: 10/04/2008, 23h41

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