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 :

[langage] appel d'un tableau dans une fonction


Sujet :

Langage Perl

  1. #1
    Membre habitué
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Points : 144
    Points
    144
    Par défaut [langage] appel d'un tableau dans une fonction
    salut,

    J'ai un script dans lequel je passe en parametre de ma fonction un tableau defini plus dans le script.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    my @montableau = ( ...);
    ...
    sub mafonction {
     
    my @montab = shift;
    ...
    }
    ..
    #appel de ma fonction
    &mafonction (@montableau);
    ma fonction tourne mais s'arrete, elle ne renvoit que le premiere element du tableau.

    Je ne comprend pas ???


    Merci

  2. #2
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    C'est un comportement tout à fait normal.

    shift récupère la première valeur du tableau des paramètres (@_) et la transmet dans la variable qu'on lui indique avant de la supprimer de la liste. shift ne va jamais récupérer plus que ça à la fois ...

    Le tableau étant "aplati" lors de son passage à la fonction, @_ contient tous les éléments du tableau, un par un. Il faut donc tous les récupérer.

    Pour cela, soit on fait une suite d'affectation avec plein de shift, mais ce n'est pas très efficace/pertinent, soit on récupère tout d'un coup :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sub mafonction {
     
    my @montab = @_;
    ...
    }
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  3. #3
    Membre habitué
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Points : 144
    Points
    144
    Par défaut
    ça fonctionne merci
    je ne savais pas que shift retournait seulement la premiere valeur
    Merci.

  4. #4
    Membre habitué
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Points : 144
    Points
    144
    Par défaut
    donc pour un tableau on declare comme cela
    my @tab = @_;

    et pour une hash
    c'est comme cela :
    my %hash = %_ ??


    Merci

  5. #5
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    Non, c'est juste que @_ est un tableau qui contient les paramètres passés à la sub...

    Si tu passes une hash à la méthode, elle sera stockée dans le tableau @_...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    sub test(%$)
    {
        my (%hash, $string) = @_;
       ... code ...
    }
     
    my %var_hash = ();
    my $var_string = "yes";
    &test(%var_hash, $var_string);

    Je ne répond à aucune question technique par MP.

    Si votre problème est réglé, n'oubliez pas Dans tous les cas

  6. #6
    Membre habitué
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Points : 144
    Points
    144
    Par défaut
    j'ai essayer mais sa ne fonctionne pas
    quand j appel mon hash je n 'ai rien à part des message d'erreurs

  7. #7
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    Effectivement, j'avais fait une erreur, j'avais mis "my" devant sub... J'ai corrigé à présent !

    Je ne répond à aucune question technique par MP.

    Si votre problème est réglé, n'oubliez pas Dans tous les cas

  8. #8
    Membre habitué
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Points : 144
    Points
    144
    Par défaut
    moi je n'ai pas mis my devant sub et sa bogue
    je comprend pas pourquoi t'utilise $string ??

  9. #9
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    C'était juste pour te montrer un exemple en passant plusieurs variables... Et le "... code ... " signifie que tu dois mettre ton code, ca ne fonctionne pas sans modif. Si tu préfères passer juste une hash, voici un exemple complet et fonctionnel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    use strict;
    use warnings;
     
    sub test(%)
    {
        my (%hash) = @_;
        # ... code ...
        print( $hash{'toto'} . "\n" );
    }
     
    my %var_hash = (
      # on remplit la hash...
      'toto' => 'titi'
    );
     
    &test(%var_hash); # affiche "titi"

    Je ne répond à aucune question technique par MP.

    Si votre problème est réglé, n'oubliez pas Dans tous les cas

  10. #10
    Membre habitué
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Points : 144
    Points
    144
    Par défaut
    je pense que c'est plus compliqué que sa
    il y a une histoire de reference

  11. #11
    Membre éclairé
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Points : 803
    Points
    803
    Par défaut
    Citation Envoyé par donny
    je pense que c'est plus compliqué que sa
    il y a une histoire de reference
    Si tu utilises pas de prototypes pour des fonctions, tu dois en effet envoyer une référence à un hash:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    sub foo {
      my ($hash_ref, $string) = @_;
    }
     
    foo({ foo => "bar" }, "bonjour");
    Par contre, si ma mémoire ne me trompe pas bien sûr, avec un prototype, tu peux faire comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    sub foo(%$) {
      my (%hash, $string) = @_;
    }
     
    my %hash = ( foo => "bar" );
    foo(%hash, "bonjour");
    Je devrai vérifier avec mon camel book, mais il me semble que c'est exact. Il faut dire que j'utilise quasiment jamais les prototypes, je préfère passer des références.

  12. #12
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    Tu parles de quoi au juste ? Si ce que tu veux, c'est passer une hashmap en paramètre, essaye mon programme, il fonctionne... Après, si tu veux passer une hashmap par référence, c'est possible aussi !


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    use strict;
    use warnings;
     
    sub test(\%)
    { 
    	my ($hashRef) = @_;
    	# ... code ...  
    	print( $$hashRef{'toto'} . "\n" ); 
    }
     
    my %var_hash = (  
        # on remplit la hash...  
        'toto' => 'titi' 
    );
     
    &test(\%var_hash); # affiche "titi"

    Je ne répond à aucune question technique par MP.

    Si votre problème est réglé, n'oubliez pas Dans tous les cas

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

Discussions similaires

  1. [Tableaux] Comment faire un tableau dans une fonction?
    Par Alexandrebox dans le forum Langage
    Réponses: 6
    Dernier message: 06/10/2008, 00h12
  2. Retourner un tableau dans une fonction
    Par oranoutan dans le forum Débuter
    Réponses: 14
    Dernier message: 05/10/2007, 13h39
  3. retour d'un tableau dans une fonction
    Par FlyByck dans le forum Delphi
    Réponses: 3
    Dernier message: 19/01/2007, 00h00
  4. Réponses: 1
    Dernier message: 28/12/2006, 17h02
  5. Accéder à un tableau dans une fonction
    Par valanagrid dans le forum C++
    Réponses: 10
    Dernier message: 18/09/2006, 16h08

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