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 :

fonction avec deux listes en paramétres


Sujet :

Langage Perl

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Avril 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2012
    Messages : 29
    Par défaut fonction avec deux listes en paramétres
    Bonjour,
    je suis entrain d'ecrire une fonction avec deux tableaux comme parametres je lui passe ces derniers comme reference mais je n'arrive pas a recupere les valeur des deux tableaux pour faire deux foreach imbrique.

    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
    my $reftbb = \@tbb;
    my $reftaa = \@taa;
    my $refrecord_tempa = \@record_tempa;
    my $refrecord_temp = \@record_temp;
     
    #foreach (@record_temp){ print "$_";}
    #foreach (@record_tempa){print "$_";}
     
    ($reftbb,$reftaa) = search_cnx(\@record_tempa,\@record_temp);
     
    sub search_cnx{
    	my $t_a = $_[0];
    	my $t_b = $_[1];
     
    	print "$_[0]\n";
     
    	foreach my $ta (@$t_a){
    		print "$ta";
    		foreach my $tb (@$t_b){

  2. #2
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 63
    Par défaut
    La balise "code" est notre amie, elle ne mord pas tu sais ?

    Hop bon je met la balise code et je jette un oeil.
    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
    my $reftbb = \@tbb;
    my $reftaa = \@taa;
    my $refrecord_tempa = \@record_tempa;
    my $refrecord_temp = \@record_temp;
     
    #foreach (@record_temp){ print "$_";}
    #foreach (@record_tempa){print "$_";}
     
    ($reftbb,$reftaa) = search_cnx(\@record_tempa,\@record_temp);
     
    sub search_cnx{
    	my $t_a = $_[0];
    	my $t_b = $_[1];
     
    	print "$_[0]\n";
     
    	foreach my $ta (@$t_a){
    		print "$ta";
    		foreach my $tb (@$t_b){

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 63
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach my $ta (@$t_a){
    Il y a un truc qui me chiffonne ici, le @$. Ote voir le $ et dit moi si c'est ça.

    Ta ligne 69
    Ma ligne 17

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Avril 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2012
    Messages : 29
    Par défaut
    Citation Envoyé par Quantactique Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach my $ta (@$t_a){
    Il y a un truc qui me chiffonne ici, le @$. Ote voir le $ et dit moi si c'est ça.

    Ta ligne 69
    Ma ligne 17
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    my @s = (1,2,3,4,5);
    my @ss = (23,12,45,78);
    ($reftbb,$reftaa) = search_cnx (\@s,\@ss);#(\@record_tempa,\@record_temp);
     
    sub search_cnx{
            my $t_a = $_[0];
            my $t_b = $_[1];
            #foreach(@{$_[0]}){print"$_\n";}
            foreach my $ta (@{$t_a}){
                    print "$ta";
                    foreach my $tb (@{$t_b}){
    avec deux petites liste ca marche

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 63
    Par défaut
    Bon ben problème résolu ?

    Sinon juste comme ça, elle consiste en quoi la manip, je me doute que c'est une recherche au vu de la fonction mais tu cherche quoi ? (Pure curiosité ^^)

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Avril 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2012
    Messages : 29
    Par défaut
    Citation Envoyé par Quantactique Voir le message
    Bon ben problème résolu ?

    Sinon juste comme ça, elle consiste en quoi la manip, je me doute que c'est une recherche au vu de la fonction mais tu cherche quoi ? (Pure curiosité ^^)
    le probleme n'est pas resolu car si je lui passe mes deux tableau qui ne sont pas enorme mais un peu gros la fonction ne marche plus

    je cherche a faire un netoyage d'information sur deux tableau

  7. #7
    Membre émérite Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Par défaut
    Citation Envoyé par Quantactique Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach my $ta (@$t_a){
    Il y a un truc qui me chiffonne ici, le @$. Ote voir le $ et dit moi si c'est ça.

    Ta ligne 69
    Ma ligne 17
    cette écriture est correcte, tout comme le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach my $ta (@{$t_a}){
    les 2 déréférencent l'arrayref en array, donc le problème ne vient pas de là...
    il n'a pas l'air d'y avoir de problèmes au niveau de la fonction, comment arrivent tes tableaux, et comment les testes-tu ?

  8. #8
    Membre averti
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Avril 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2012
    Messages : 29
    Par défaut
    Citation Envoyé par Gardyen Voir le message
    cette écriture est correcte, tout comme le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach my $ta (@{$t_a}){
    les 2 déréférencent l'arrayref en array, donc le problème ne vient pas de là...
    il n'a pas l'air d'y avoir de problèmes au niveau de la fonction, comment arrivent tes tableaux ?

    parce qu'en revanche, ça ça m'interpelle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ($reftbb,$reftaa) = search_cnx(\@record_tempa,\@record_temp);
    ehh ba les tableaux sont composee de string melangee avec / et parfois des espaces .
    car je print (juste avant la fonction) les 2 tableau ils sont normalement remplis.
    je ne sais pas si c'est a cause des espaces ou .....

  9. #9
    Membre averti
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Avril 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2012
    Messages : 29
    Par défaut
    Citation Envoyé par misterfed Voir le message
    ehh ba les tableaux sont composee de string melangee avec / et parfois des espaces .
    car je print (juste avant la fonction) les 2 tableau ils sont normalement remplis.
    je ne sais pas si c'est a cause des espaces ou .....
    !!!!!!!!!!!Pourquoi cela t'interpel ??????????

    voilaaaa mon errorr

    Can't use string ("") as an ARRAY ref while "strict refs"

  10. #10
    Membre émérite Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Par défaut
    parce que dans le code que tu as passé toute la partie return manque
    il n'y a pas d'erreurs dans le code que tu as posté au début

  11. #11
    Membre averti
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Avril 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2012
    Messages : 29
    Par défaut
    Citation Envoyé par Gardyen Voir le message
    parce que dans le code que tu as passé toute la partie return manque
    il n'y a pas d'erreurs dans le code que tu as posté au début
    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
    sub search_cnx{
         67         my $t_a = $_[0];
         68         my $t_b = $_[1];
         69         #foreach(@{$_[0]}){print"$_\n";}
         70         foreach my $ta (@{$t_a}){
         71                 print "$ta";
         72                 foreach my $tb (@{$t_b}){
         73                 print "$tb";
         74                         my @tbok = split ("/",$tb );
         75                         my $b = $tbok[0];
         76                         my $b_d = $tbok[1];
         77                         my @taok = split ("/",$ta );
         78                         my $a = $taok[0];
         79                         my $a_d = $taok[1];
         80                         if ($b eq $a){
         81                                 if(($b eq "inst") && ($a =~ m/(inst)$/i)){
         82                                         next;
         83                                         return ($ta,$tb);
         84                                 }else{
         85                                         ($ta ,$tb)=($tb,$ta);
         86                                         search_cnx($ta,$tb);
         87                                 }
         88                         }
         89                 }
         90         }
    voila toute la fonction je ne comprend pas ta remarque

  12. #12
    Membre émérite Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Par défaut
    je disais juste que ce que tu avais mis ne comportait aucune erreur donc l'erreur provient de ce que tu nous as pas montré!
    en revanche dans le traitement que tu viens d'afficher, tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     if(($b eq "inst") && ($a =~ m/(inst)$/i)){
         82                                         next;
         83                                         return ($ta,$tb);
         84                                 }else{
         85                                         ($ta ,$tb)=($tb,$ta);
         86                                         search_cnx($ta,$tb);
         87                                 }
    dans le else ligne 87, tu passes $ta et $tb à ta fonction; or ce sont des strings ! pas des références à des listes.
    et ligne 86, euh ben tu ... échanges les valeurs de $a et $b ???

  13. #13
    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
    Citation Envoyé par Gardyen Voir le message
    dans le else ligne 87, tu passes $ta et $tb à ta fonction; or ce sont des strings ! pas des références à des listes.
    Exactement ce que j'allais dire.

    J'ajoute que les variables $b_d et $a_d ne sont utilisées nulle part et que, d'ailleurs, dans le contexte de ton exemple, elles ne seraient pas définies, puisqu'il n'y a pas de "/" dans tes données.

    De même, à quoi servent les parenthèses autout de "inst" dans

    puisque tu n'utilises pas la valeur capturée (qui, de toutes façons sera toujours égale à "inst" si l'expression régulière réussit.

    Enfin il semble y avoir une incohérence entre l'appel de la fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my ($reftbb,$reftaa) = search_cnx ...
    et ce qu'elle renvoie:

    (pas le même ordre pour les valeurs de retour).

  14. #14
    Membre averti
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Avril 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2012
    Messages : 29
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Exactement ce que j'allais dire.

    J'ajoute que les variables $b_d et $a_d ne sont utilisées nulle part et que, d'ailleurs, dans le contexte de ton exemple, elles ne seraient pas définies, puisqu'il n'y a pas de "/" dans tes données.

    De même, à quoi servent les parenthèses autout de "inst" dans

    puisque tu n'utilises pas la valeur capturée (qui, de toutes façons sera toujours égale à "inst" si l'expression régulière réussit.

    Enfin il semble y avoir une incohérence entre l'appel de la fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my ($reftbb,$reftaa) = search_cnx ...
    et ce qu'elle renvoie:

    (pas le même ordre pour les valeurs de retour).
    toutes les remarque la je suis conscient mais la fonction est en construction mais le soucie c'est ca ne me fais meme pas le print ligne 72 et ligne 73

  15. #15
    Membre averti
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Avril 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2012
    Messages : 29
    Par défaut
    Citation Envoyé par misterfed Voir le message
    toutes les remarque la je suis conscient mais la fonction est en construction mais le soucie c'est ca ne me fais meme pas le print ligne 72 et ligne 73
    J'ai mis en commentaire USE STRICT et mes print passent

  16. #16
    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
    OK, c'était juste des remarques sur ce qui ne me paraissait pas aller. Je pense que corriger ces points éliminerait déjà certains problèmes.

    J'ai lancé ta fonction avec les initialisations qui tu avais données dans ton exemple (my @s = (1,2,3,4,5); my @ss = (23,12,45,78) , et après avoir modifié les "print" pour y voir plus clair (et corrigé deux ou trois menues erreurs empêchant la compilation correcte: 2 } manquantes à la fin, variables @s et @ss non déclarées).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     foreach my $ta (@{$t_a}){
         print "ta = $ta\n";
         foreach my $tb (@{$t_b}){
         print "tb = $tb\n";
    Et ça parcourt bien les deux boucles impriquées et ça m'imprime bien ceci:

    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
    ta = 1
    tb = 23
    tb = 12
    tb = 45
    tb = 78
    ta = 2
    tb = 23
    tb = 12
    tb = 45
    tb = 78
    ta = 3
    tb = 23
    tb = 12
    tb = 45
    tb = 78
    ta = 4
    tb = 23
    tb = 12
    tb = 45
    tb = 78
    ta = 5
    tb = 23
    tb = 12
    tb = 45
    tb = 78
    Le problème essentiel de ton programme est que l'appel récursif à la fonction est bugué:

    puisque cette fonction attend deux références à des tableaux et que tu lui passes des scalaires. Je n'ai pas rencontré le problème dans mon exécution parce que cet appel récursif ne se fait pas avec le jeu de données qui tu as fourni.

    D'ailleurs, dans la mesure où tu as deux boucles imbriquées pour parcourir les deux listes, je ne vois pas trop la raison de cet appel récursif.

    Peut-être pourrais tu fournir un jeu de données en entrée plus réaliste pour que l'on comprenne mieux ce que tu cherches à faire avec ton programme et que l'on voit le chemin d'exécution avec ces données.

    Petite remarque stylistique pour finir: essaie d'écrire vraiment en perl, plutôt que de faire du C en perl. Là, tu perds une bonne partie du plaisir de programmer en Perl (et j'insiste que c'est un plaisir de tirer parti de l'expressivité de ce langage).

    Deux exemples:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
             my @tbok = split ("/",$tb );
             my $b = $tbok[0];
             my $b_d = $tbok[1];
             my @taok = split ("/",$ta );
             my $a = $taok[0];
             my $a_d = $taok[1];
    s'écrit beaucoup plus simplement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my ($b, $b_d) = split ("/", $tb );
    my ($a, $a_d) = split ("/", $ta );
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     my $t_a = $_[0];
     my $t_b = $_[1];
    peut s'écrire:


  17. #17
    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
    Je n'avais pas vu ton dernier message quand j'ai posté le mien ci-dessus.

    Citation Envoyé par misterfed Voir le message
    J'ai mis en commentaire USE STRICT et mes print passent
    Mauvaise idée. Use strict rend de grands services et, à mon avis, ne pas le mettre ou le mettre en commentaire est déjà un bug.

    J'ai testé ton programme avec use strict et use warnings, et il est passé sans difficulté moyennant deux petites corrections du code (déclaration avec my des variables utilisées) et a bbien fait les print, comme le montre mon post précédent.

  18. #18
    Membre averti
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Avril 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2012
    Messages : 29
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Je n'avais pas vu ton dernier message quand j'ai posté le mien ci-dessus.



    Mauvaise idée. Use strict rend de grands services et, à mon avis, ne pas le mettre ou le mettre en commentaire est déjà un bug.

    J'ai testé ton programme avec use strict et use warnings, et il est passé sans difficulté moyennant deux petites corrections du code (déclaration avec my des variables utilisées) et a bbien fait les print, comme le montre mon post précédent.
    Merci vraiment pour ton aide. tu as raison je suis développeur C depuis X années. mais je commence a adopter PERL.
    pour mon jeux de test c'est un peu complique:
    mais je vais essayer de trouver un jeux de test
    merci pour tout

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

Discussions similaires

  1. [AC-2003] Requête paramétrée avec deux listes déroulantes.
    Par hadrimo dans le forum Access
    Réponses: 3
    Dernier message: 17/10/2014, 21h58
  2. Réponses: 2
    Dernier message: 29/01/2013, 14h46
  3. [AC-2003] Comment appeler une fonction avec deux paramètres. Erreur '=' attendu
    Par nirG95 dans le forum VBA Access
    Réponses: 1
    Dernier message: 02/09/2009, 10h53
  4. Réponses: 7
    Dernier message: 19/05/2006, 16h47
  5. Fonction avec un recordset en paramètre
    Par Poussy-Puce dans le forum ASP
    Réponses: 1
    Dernier message: 20/01/2006, 20h40

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