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] Passage de paramètres dans une fonction


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2002
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 39
    Points : 34
    Points
    34
    Par défaut [langage] Passage de paramètres dans une fonction
    Bonjour

    Comment fait on pour passer un tableau et un variable en même temp dans une fonction ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    check_list(\@tableau, $locus{$var}[$z]);
     
     
    sub check_list
    {
    	@ess = $_[0]; #############################
    $variable = $_[1];
    	foreach $t (0..$#ess)
    	{
    		print "\n$t $ess[$t] $_[1] ";
    	}
    }

    Je sens bien que le problème vient de cette ligne mais le OReilly ne m'aide pas beaucoup d'après lui les arguments sont dans $_[0] ou dans @_ mais j'arrive pas à lui faire prendre le tableau.
    Il m'écris ARRAY(....) au lieu de $ess[$t]

    Help please

    Merci d'avance

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut Re: Passage de paramètres dans une fonction
    Bonjour,

    je procèderais comme ceci :

    version avec référence sur le tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    check_list(\@tableau, $locus{$var}[$z]);
    sub check_list
    {
    	my ($ess, $variable) = @_;
            for (my $i = 0; $i < scalar(@{$ess}); ++$i)
            {
    		print "\n$i $ess->[$i] $variable ";
    	}
    }
    version sans référence
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    check_list(@tableau, $locus{$var}[$z]);
    sub check_list
    {
    	my (@ess, $variable) = @_;
            for (my $i = 0; $i < scalar(@ess); ++$i)
            {
    		print "\n$i $ess[$i] $variable ";
    	}
    }

  3. #3
    Jeh
    Jeh est déconnecté
    Membre actif Avatar de Jeh
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 203
    Points : 250
    Points
    250
    Par défaut
    la je devrais pas me cracker..
    Première solution :
    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
    17
    check_list(\@tableau, $locus{$var}[$z]);
     
     
    sub check_list
    {
       my ($tab,$variable) = @_;
       #@ess = $_[0]; 
    #$variable = $_[1];
       my @ess = @$tab; #tu récupères ton tableau
       my $longueur = @ess;
    # foreach $t (0..$#ess)
       foreach my $t (0..$longueur)
       {
          #print "\n$t $ess[$t] $_[1] ";
          print "\n$t $ess[$t] $variable ";
       }
    }
    Deuxième solution :
    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
    17
    check_list($locus{$var}[$z],@tableau);
     
     
    sub check_list
    {
       my ($variable,@ess) = @_;
       #@ess = $_[0]; 
    #$variable = $_[1];
     
       my $longueur = @ess;
    # foreach $t (0..$#ess)
       foreach my $t (0..$longueur)
       {
          #print "\n$t $ess[$t] $_[1] ";
          print "\n$t $ess[$t] $variable ";
       }
    }
    Verre vide je te plains, verre plein, je te vide.

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Jeh, je comprend pas pourquoi, dans ton 1er exemple, tu passes ton tableau par adresse dans ta fonction et que tu crées un tableau qui contient ce que contient la référence. Le mieux était de bosser directement avec la référence, non ?

    Arf, j'oublie le sempiternel TIMTOWTDI

  5. #5
    Jeh
    Jeh est déconnecté
    Membre actif Avatar de Jeh
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 203
    Points : 250
    Points
    250
    Par défaut
    bah c'est juste histoire de m'adapter à son exemple sans tout changer.
    Mais c'est vrai que c'est pas forcément ce qu'il y a de mieux. Et puis j'aime pas travailler avec des références, j'trouve que ça complexifie le code. Bon, là tu va me dire...pas très complexe...
    J'vais m'donner une excuse () : je connais pas le perl depuis longtemps...et les références, ça fait pas super longtemps que j'ai compris comment ça marchait.
    : : TIMTOWTDI
    Verre vide je te plains, verre plein, je te vide.

  6. #6
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Citation Envoyé par Jeh
    Et puis j'aime pas travailler avec des références...
    Spa compliqué
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # pointer sur le 1er élem d'un tableau via référence
    $ref = \@tab;
    print "$ref->[0]\n";
    print "$tab[0]\n";  # idem en passant par le tableau
     
    # avec un hash, 2 exemples faisant la même chose
    $ref = \%hash;
    print "clé 1 = $ref->{1}\n";
    print "clé 1 = $hash{1}\n";
     
    # et avec un scalaire
    $ref = \$scalaire;
    print "scalaire = $$ref\n";
    print "scalaire = $scalaire\n";
    Citation Envoyé par Jeh
    : : TIMTOWTDI
    There Is More Than One Way To Do It

  7. #7
    Jeh
    Jeh est déconnecté
    Membre actif Avatar de Jeh
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 203
    Points : 250
    Points
    250
    Par défaut
    Citation Envoyé par Arioch
    There Is More Than One Way To Do It
    Là c'est plus parlant...je note !
    Verre vide je te plains, verre plein, je te vide.

  8. #8
    Nouveau membre du Club
    Inscrit en
    Mai 2002
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 39
    Points : 34
    Points
    34
    Par défaut
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    foreach $var (keys %locus)
    {
    	@tableau=();
    	foreach $z (0..$#{$locus{$var}})
    	{
    		print "\n$z $locus{$var}[$z]";
    		$retour = check_list(\@tableau,$locus{$var}[$z]);
    		if ($retour == 0)
    		{
    			push(@tableau,$locus{$var}[$z]);
    		}
    	}
    	$final{$var}=[@tableau];
    	undef @tableau;
    }
     
    sub check_list
    {
    	$rep = 0;
    	my (@ess,$toto) = @_;
    	for ($t=0;$t<scalar(@ess);$t++)
    	{
    		if ($ess[$t] == $toto)
    		{
    			$rep = 1;
    		}
    		print "\tAA $t YY $ess[$t] TT $toto";
    	}
    	return $rep;
    }
    Ca ne marche pas le but est de retirer les doublons d'une liste pour les mettre dans un tableau et ça ne marche pas même avec l'aide précieuse que vous me donnez

    Voila ce qu'il me fait :
    445 125 AA 0 YY ARRAY(0x10ae00) TT AA 1 YY 125 TT
    446 125 AA 0 YY ARRAY(0x10ae00) TT AA 1 YY 125 TT
    447 125 AA 0 YY ARRAY(0x10ae00) TT AA 1 YY 125 TT
    448 141 AA 0 YY ARRAY(0x10ae00) TT AA 1 YY 141 TT
    449 123 AA 0 YY ARRAY(0x10ae00) TT AA 1 YY 123 TT
    450 101 AA 0 YY ARRAY(0x10ae00) TT AA 1 YY 101 TT

    HELP

  9. #9
    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
    And_the_problem_is, pourquoi n'utilises tu pas ma fonction check_list ?? Elle marchait très bien, à part un léger détail (les accolades autour de "$_[0]"), tu aurais dû soulever le problème dans ce thread... Voilà un script qui fait à peu près ce que tu veux, avec une version corrigée de ma fonction :
    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
    17
    18
    19
    20
     
    #! /usr/bin/perl
     
    use strict;use warnings;
     
     
    sub check_list { return (grep { $_ == $_[1] } @{$_[0]});} 
     
    my @ar1 = (1, 2, 3, 5, 5, 3, 1);
    my @ar2;
     
    foreach my $elt (@ar1){
        if (not check_list(\@ar2, $elt))
        {
            push(@ar2,$elt)
        } 
    }
     
    $, = " ";
    print @ar2;
    Attention cette fonction est pour des tableaux de valeur numériques seulement, pour des string, il faut remplacer "==" par "eq" dans le grep.

    --
    Jedaï

  10. #10
    Nouveau membre du Club
    Inscrit en
    Mai 2002
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 39
    Points : 34
    Points
    34
    Par défaut
    Mais c'est ce que j'ai fait mais ça ne marchait pas j'y ai cru mais en fait non
    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
    17
    18
    19
    20
     
    foreach $var (keys %locus)
    {
    	@tableau=();
    	foreach $z (0..$#{$locus{$var}})
    	{
    		if (not check_list(@tableau, $locus{$var}[$z])) 
    		{ 
    			push(@tableau,$locus{$var}[$z]);
    		} 
    	}
    	for ($w = 0; $w < scalar(@tableau);$w++)
    	{
    		print "\nTOTO $var TITI $tableau[$w]";
    	}
    	$final{$var}=[@tableau];
    	undef @tableau;
    }
     
    sub check_list { return (grep { $_ eq $_[1] } @{$_[0]});}
    TOTO gwm186 TITI 135
    TOTO gwm186 TITI 125
    TOTO gwm186 TITI 123
    TOTO gwm186 TITI 125
    TOTO gwm186 TITI 125
    TOTO gwm186 TITI 125
    TOTO gwm186 TITI 141
    TOTO gwm186 TITI 123

    Normalement après TITI je ne dvrais avoir qu'une seule fois 125 etc et ce n'est pas le cas. Donc j'ai essayé de bidouiller et ça ne marche pas et je sais plus quoi faire

    Donc HELP

  11. #11
    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
    Il faut faire attention aux détails, ici tu as au moins deux lignes de fausses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (not check_list(\@tableau, $locus{$var}[$z]))  #pas @tableau, \@tableau
    Par ailleurs, j'ai dit qu'il fallait remplacer "==" par "eq" si tu avais affaire à un tableau de string, or à priori, 125 ou 135 n'a rien d'une chaîne de caractère !!!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sub check_list { return (grep { $_ == $_[1] } @{$_[0]});}

  12. #12
    Nouveau membre du Club
    Inscrit en
    Mai 2002
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 39
    Points : 34
    Points
    34
    Par défaut
    Merci beaucoup ça mache c'est fout comme un petit \ de rien du tout peu tout changer

    Encore une fois merci

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

Discussions similaires

  1. Passage d'un tableau php dans une fonction javascript
    Par mcdelay dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 25/09/2013, 17h25
  2. Passage de données en parametre dans une fonction javascript
    Par mcdelay dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 09/08/2012, 14h19
  3. passage d'un argument void* dans une fonction
    Par angel46 dans le forum C
    Réponses: 3
    Dernier message: 25/11/2007, 17h53
  4. Réponses: 6
    Dernier message: 24/12/2004, 16h46
  5. Réponses: 4
    Dernier message: 03/03/2004, 11h04

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