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 :

Récurrence en perl ?


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 62
    Points : 43
    Points
    43
    Par défaut Récurrence en perl ?
    Voilà, comme l'indique le titre, je cherche un moyen de faire fonctionner systeme récurrent en perl... une fonction qui s'appel elle-même dans certains cas.

    Ma première question : peut-on faire de la recurrence en perl ?
    Si oui, vous pouvez continuer de lire . . . et peut-être m'aider par la suite . . .
    Si non, auriez-vous quelques conseils pour contourner mon problème ? (il faut lire quand même )

    - - - - -

    Le problème est que je n'ai aucune idée de comment faire cela, j'ai essayé plusieurs chose mais sans résultat... si quelqu'un a une idée de comment m'y prendre ?

    Mon programme se présente de la manière suivante :

    - un package Utils.pm contenant ma fonction qui est censée dans certains cas s'appeler elle-même.
    - un script Decoup.pl faisant appel à cette fonction.

    La fonction CutText n'est pas compliqué en elle même :

    - elle découpe un texte en plusieurs morceau selon certains critères
    - si l'un des morceaux est trop gros ou ne correspond pas à d'autre critères, je relance la fonction CutText sur ce morceau.

    La fonction se lance bien depuis Decoup.pl mais pas depuis "elle-même", j'ai essayé de la lancer des manières suivantes :
    - Utils::CutText($morceau_a_recouper); (c'est comme ça que je la lance dans Decoup.pl)
    - CutText($morceau_a_recouper);
    - &CutText($morceau_a_recouper);

    Merci d'avance pour toute vos réponse !

  2. #2
    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
    Attention à ne pas confondre, on ne parle pas de récurrence, mais de récursivité

    La récurrence, c'est le fait d'executer quelque chose plusieurs fois, la récursivité, c'est avoir quelque chose qui fait appel lui-même sur un sous ensemble de données.

    En Perl, oui, c'est tout à fait faisable de faire de la récursivité. Peux-tu montrer un peu plus de code de ton module pour qu'on puisse t'aider ?

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

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

  3. #3
    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
    Voici un petit exemple:

    Recursive.pm
    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
    package Recursive;
     
    use strict;
    use warnings;
     
    BEGIN {
            use Exporter;
            our @ISA        = qw(Exporter);
            our @EXPORT     = qw(&countdown);
    }
     
    sub countdown($)
    {
    	my ($value) = @_;
    	print("il reste $value secondes\n");
    	sleep(1);
     
    	if ($value == 0) {
    		print("fini !\n");
    	}
    	else {
                # la fonction fait appel à elle-même !
    	    &countdown($value - 1);
    	}
    }
     
    1;
    callrecursive.pl
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    use strict;
    use warnings;
    use Recursive;
     
    # on fait appel à la fonction récursive
    &countdown(3);

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

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

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 62
    Points : 43
    Points
    43
    Par défaut
    Ah désolé, récursivité...

    Bah en code j'ai pas trop le droit de faire sortir des lignes de code de mon taff... m'enfin je peux toujours montrer la structure... du moins je vais essayé...

    Code 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    sub CutText
    {
          my $i=0;
          my $text=$_[0];
          my @tabA=@$_[1]; #tableau qui contient les morceaux de type A
          my @tabB=@$_[2]; #tableau qui contient les morceaux de type B
     
          ## Là j'ai le code de traitement que je ne peux pas mettre
          ## Il me donne deux tableaux temporaires @A et @B
          my $longA = @A;
          my $longB = @B;
     
          # Vérification pour A
          for($i=0;$i<$longA;$i++)
          {
               if(...) #condition de stockage ou retraitement du morceau de type A
               {
                     push @tabA,$A[$i];
               }
               else
               {
                     CutText($A[$i],\@tabA,\@tabB);
               }
          }
     
          ## pour B c'est pareil
     
          return(\@tabA,\@tabB);
    }
    Mes conditions sont faites de manière à éviter les boucles de récursivité infinie... (enfin j'espère... j'ai pas encore pu les tester)

    Quand je lance mon programme il me dit :
    Undefined subroutine &Utils::CutText called at Utils.pm line 73.

  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
    Ce qui m'interressait plus, c'était l'entête du module en réalité. Je pense que le problème vient du fait que tu n'as pas déclaré la méthode CutText dans la liste des méthodes exportées. Inspire toi de l'exemple que j'ai posté juste avant, ca devrait t'aider

    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 du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 62
    Points : 43
    Points
    43
    Par défaut
    Ah mince j'étais en train de tapper, j'ai pas vu ton message...
    Si je comprends bien, c'est un compte à rebours...
    mais je comprends pas trop comment ça fonctionne... je connais perl depuis pas longtemp, va falloir que je bosse un peu plus...

  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
    En gros, il faut utiliser en premier lieu le package Exporter.
    La variable ISA déclare de quel(s) package(s) on "hérite", un peu comme en objet. Ici, on veut hériter des propriétés du module Exporter.
    La variable EXPORT quand à elle définit les variables et subs à exporter, par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    BEGIN {
            # module à utiliser pour pouvoir exporter des données 
            use Exporter;
            # liste des packages dont on hérite
            our @ISA        = qw(Exporter);
            # liste des variables et méthodes à exporter
            our @EXPORT     = qw( &CutText $toto @montableau1 @montableau2 $abc %mahash );
    }
    Et c'est suffisant pour régler ton problème

    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 é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
    Si tu veux plus de détails sur l'écriture de modules, voir ici:
    page perlmod, traduite par enstimac (format PDF)



    C'est instructif, mais c'est un poil rébarbatif

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

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

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 62
    Points : 43
    Points
    43
    Par défaut
    Merci , c'est bon ça marche . . . bon j'ai juste à modifier certaines de mes conditions mais sinon la récursivité fonctionne !

  10. #10
    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
    Ok, alors n'oublie pas,

    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. [langage] Comparer Perl avec d'autres langages comme C ?
    Par Anonymous dans le forum Langage
    Réponses: 3
    Dernier message: 10/08/2002, 23h52
  2. [langage] Inclure de perl en c !!!
    Par ryo00 dans le forum Langage
    Réponses: 2
    Dernier message: 30/05/2002, 10h03
  3. Réponses: 2
    Dernier message: 30/05/2002, 08h54
  4. [réseaux] Bench en Perl pour avoir le débit entre 2 pc
    Par Frich dans le forum Programmation et administration système
    Réponses: 4
    Dernier message: 22/05/2002, 17h22
  5. [web] Cherche un conseil pour un livre perl-tk
    Par Anonymous dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 29/04/2002, 15h35

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