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 recursive sur un tableau passé en parametre


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    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
    Points : 20
    Points
    20
    Par défaut Fonction recursive sur un tableau passé en parametre
    Bonjour,
    J'ai écris une fonction recursive sur un tableau passé en parametre (par reference). J'ai un beug un peu serieux car je n'arrive pas à le resoudre malgré le temps passé dessus. (je suis debutant en PERL)
    le beug: quand je veux faire un print de $f ou $ff il m'affiche "////"
    or quand je fais un foreach sur @{$ref_tab} comme suivant
    foreach(@{$ref_tab}){print "$_";} cela m'affiche mon vrai tableau qui contient des strings separé "/" .
    voila mon code.
    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
    sub search_cnx {
    	my $ref_tab = $_[0];
     
    	foreach my $f (@{$ref_tab}){
    		my @a = split (/\//, $f);foreach my $r(@a){print"$r";}
    		my ($inst_b, $port_b) = (@a[2],@a[3]);
    		my ($inst_a, $port_a) = (@a[0],@a[1]);
    		if(($inst_a eq "Poo_inst")&&($inst_b =~  m/inst/)){
    			my $ret = join ("/",$inst_a,$port_a,$inst_b,$port_b);
    			#print "$ret\n";
    			return $ret;
    		}else{
     
    			foreach my $ff (@{$ref_tab}){
    				my @aa = split (/\//, $ff);
    				my ($inst_ab, $port_ab) = (@aa[2],@aa[3]);
    				my ($inst_aa, $port_aa) = (@aa[0],@aa[1]);
    				if($inst_a eq "Poo_inst"){
    					if($inst_b =~ m/$inst_aa/i){
    						@{$ref_tab}[$ff]=join ("/",$inst_a,$port_a,$inst_aa,$port_ab);	
    						search_cnx(\@{$ref_tab});
    					}
    				}elsif($inst_a =~ m/$inst_ab/i){
    					@{$ref_tab}[$ff]=join ("/",$inst_ab,$port_aa,$inst_b,$port_ab);	
    					search_cnx(\@{$ref_tab});
    				}
    			}
    		}
    	}
    }
    merci pour toutes remarques (meme sur la façon d'écrire du PERL car je veux m'améliorer dans ce language )
    PS: cette fonction fais partie d'un code dont j'ai utilisé le use strict.

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Correction rapide sans savoir ce qu'il y a dans tes tableaux
    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
    31
    32
    33
    34
    35
    sub search_cnx {
      my ($ref_tab) = @_;
     
      foreach my $f ( @{$ref_tab} ) {
        my @a = split /\//, $f;
        foreach my $r (@a) { print "$r"; }
     
        my ( $inst_a, $port_a, $inst_b, $port_b ) = ( $a[0], $a[1], $a[2], $a[3] );
        if ( ( $inst_a eq "Poo_inst" ) && ( $inst_b =~ m/inst/ ) ) {
          my $ret = join( "/", $inst_a, $port_a, $inst_b, $port_b );
     
          #print "$ret\n";
          return $ret;
        }
        else {
     
          foreach my $ff ( @{$ref_tab} ) {
            my @aa = split /\//, $ff;
            my ( $inst_aa, $port_aa, $inst_ab, $port_ab ) = ( $aa[0], $aa[1], $aa[2], $aa[3] );
            if ( $inst_a eq "Poo_inst" ) {
              if ( $inst_b =~ m/$inst_aa/i ) {
                $ref_tab->[$ff] = join( "/", $inst_a, $port_a, $inst_aa, $port_ab );
                search_cnx( $ref_tab );
              }
            }
            elsif ( $inst_a =~ m/$inst_ab/i ) {
              $ref_tab->[$ff] = join( "/", $inst_ab, $port_aa, $inst_b, $port_ab );
              search_cnx( $ref_tab );
            }
          }
        }
      }
     
      return;
    }

  3. #3
    Membre à l'essai
    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
    Points : 20
    Points
    20
    Par défaut bonjour;
    Citation Envoyé par djibril Voir le message
    Correction rapide sans savoir ce qu'il y a dans tes tableaux
    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
    31
    32
    33
    34
    35
    sub search_cnx {
      my ($ref_tab) = @_;
     
      foreach my $f ( @{$ref_tab} ) {
        my @a = split /\//, $f;
        foreach my $r (@a) { print "$r"; }
     
        my ( $inst_a, $port_a, $inst_b, $port_b ) = ( $a[0], $a[1], $a[2], $a[3] );
        if ( ( $inst_a eq "Poo_inst" ) && ( $inst_b =~ m/inst/ ) ) {
          my $ret = join( "/", $inst_a, $port_a, $inst_b, $port_b );
     
          #print "$ret\n";
          return $ret;
        }
        else {
     
          foreach my $ff ( @{$ref_tab} ) {
            my @aa = split /\//, $ff;
            my ( $inst_aa, $port_aa, $inst_ab, $port_ab ) = ( $aa[0], $aa[1], $aa[2], $aa[3] );
            if ( $inst_a eq "Poo_inst" ) {
              if ( $inst_b =~ m/$inst_aa/i ) {
                $ref_tab->[$ff] = join( "/", $inst_a, $port_a, $inst_aa, $port_ab );
                search_cnx( $ref_tab );
              }
            }
            elsif ( $inst_a =~ m/$inst_ab/i ) {
              $ref_tab->[$ff] = join( "/", $inst_ab, $port_aa, $inst_b, $port_ab );
              search_cnx( $ref_tab );
            }
          }
        }
      }
     
      return;
    }
    merci, dans le soucie de m'ameliorer peut tu me dire le sens ou les remarque de t correction

  4. #4
    Membre à l'essai
    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
    Points : 20
    Points
    20
    Par défaut vraiment bizarre
    voila dans mon code si je fais a la ligne 3 qui est comme la ligne 4
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach $f (@{ref_tab}){print "$f";}
    cela m`affiche mon vrai tableau sous form string/string/string/string

    OR si je fais a la ligne 5
    cela m'affiche /// /// /// /// /// au lieu de string/string/string/string

    si quelqu'un vois la solution avec explication je prend avec plaisir

  5. #5
    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
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Trois conseils:
    - quand tu as un problème essaie de l'isoler en enlevant tout ce qui est inutile, tu y verras plus clair et ça permet à ceux qui lisent ton post de se concentrer plus facilement sur l'endroit où tu as un problème.
    - Utilise les directives "use strict; use warnings;"
    - Utilise le mode debug.

    En utilisant les directives use strict et use warnings, quand je compile ta fonction, j'obtiens les warnings suivant (les numéros de lignes ne correspondent pas à tes numéros car j'ai ajouté du code pour appeler la fonction):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Scalar value @a[2] better written as $a[2] at test_a_ref.pl line 16.
    Scalar value @a[3] better written as $a[3] at test_a_ref.pl line 16.
    Scalar value @a[0] better written as $a[0] at test_a_ref.pl line 17.
    Scalar value @a[1] better written as $a[1] at test_a_ref.pl line 17.
    Scalar value @aa[2] better written as $aa[2] at test_a_ref.pl line 26.
    Scalar value @aa[3] better written as $aa[3] at test_a_ref.pl line 26.
    Scalar value @aa[0] better written as $aa[0] at test_a_ref.pl line 27.
    Scalar value @aa[1] better written as $aa[1] at test_a_ref.pl line 27.
    Global symbol "%class" requires explicit package name at test_a_ref.pl line 16.
    Execution of test_a_ref.pl aborted due to compilation errors.
    Tu as donc un certain nombre de corrections à faire.

    J'ai fait une version réduite de ton code:

    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
    #!/usr/bin/perl -w
     
    use strict;
     
    my @a = ('to/to','titi');
    search_cnx (\@a);
     
    sub search_cnx {
    	my $ref_tab = $_[0];
     
    	foreach my $f (@{$ref_tab}){
    		my @a = split (/\//, $f);
    		foreach my $r(@a){print"$r\n";};
    	}
    }
    Et ça marche parfaitement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    perl  test_a_ref.pl
    to
    to
    titi
    Je ne vois donc pas où est ton problème, mais il ne semble pas être là où tu crois.

    Je ne comprends pas non plus, dans la mesure où tu parcours tout ton tableau avec un forerach pourquoi tu as besoin de rappeler la fonction récursivement.

    Mais peut-être que si tu donnais un échantillon des données en entrée, on y verrait plus clair.

  6. #6
    Membre à l'essai
    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
    Points : 20
    Points
    20
    Par défaut merciiiiiiiiiiii
    Voila mon probleme est resolue grace a votre aide.
    j'ai trouvee mon beug grace a use warnings


    merci a tous

  7. #7
    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
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Et part curiosité, c'était quoi le problème?

    PS: pour moi, à part pour des scripts unilignes, le simple fait de ne pas avoir use warnings et use strict est un bug.

    Il arrive exceptionnellement que je relâche certains contraintes de use strict (par exemple pour permettre les références symboliques) mais alors seulement dans le bloc de code où c'est nécessaire.

  8. #8
    Membre à l'essai
    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
    Points : 20
    Points
    20
    Par défaut
    Voila en utilisant use warnings y a eu un probleme dans mon tableau entre sur certaines lignes car elle contiennent des espaces et des caractere speciaux que je n'ai pas traiter or la fonction en elle meme etait bonne.
    le tableau en question fais plus de 65000 lignes.


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

Discussions similaires

  1. PB Realloc avec pointeur sur tableau passé en parametre
    Par la_chevre dans le forum Débuter
    Réponses: 2
    Dernier message: 06/02/2009, 12h04
  2. fonction rand sur un tableau ?
    Par Kyp_Durron dans le forum Langage
    Réponses: 16
    Dernier message: 17/11/2007, 23h39
  3. tableau passe en parametre
    Par semaj_james dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 08/11/2006, 17h41
  4. Réponses: 3
    Dernier message: 22/12/2005, 11h20
  5. Réponses: 4
    Dernier message: 07/10/2005, 18h34

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