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 :

Aide pour un petit script


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 42
    Points : 26
    Points
    26
    Par défaut Aide pour un petit script
    Salut

    Je debute en perl et en prog de maniere generale

    J'essaye de faire des petites choses mais aps forcement tres utiles lol

    Genere une liste des combinaisons de caracteres de '!' à 'z'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/usr/bin/perl
     
    for ($c1=33; $c1<123; $c1++) {
    for ($c2=33; $c2<123; $c2++) {
     for ($c3=33; $c3<123; $c3++) {
      for ($c4=33; $c4<123; $c4++) {  
          $mot=chr($c1).chr($c2).chr($c3).chr($c4);
          print $mot. "\n";
         } 
        }
       }
      }

    Mon probleme : Comment generer une liste comportant uniquement des chiffres et des minuscule ??? car les codes ascii ne sont pas contigus ....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/usr/bin/perl
     
    for ($n1=0; $n1<10; $n1++) {  
          print $n1. "\n";
    }
    for ($c1=97; $c1<123; $c1++) {
          $mot=chr($c1);
          print $mot. "\n";
    } 
     
    }
    }
    ==> 0 1 2 3 4 5 6 7 8 9 a b c d e f ..... z

    J'arrive a generer la liste de 0 à z mais je en vois pas comment afficher

    0000
    .....
    .....
    zzzz

    Merci pour votre aide

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 42
    Points : 26
    Points
    26
    Par défaut
    Bon j'ai trouve par moi même .. mais j'ai du changer de language : tcl

    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
     
    #!/usr/bin/tclsh
     
    set liste {0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z}
     
     
    for {set i 0} {$i<36} {incr i} {
    	for {set j 0} {$j<36} {incr j} {
    		for {set k 0} {$k<36} {incr k} {
    			for {set l 0} {$l<36} {incr l} {
    				puts -nonewline "[lindex $liste $i][lindex $liste $j][lindex $liste $k][lindex $liste $l]"
    				puts " "
    			}
    		}
    	}
    }
    ==> ca donne bien

    0000
    ......
    zzzz

  3. #3
    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
    Euh... Tu trouves ça joli et lisible ?

    Une version en Perl :
    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
     
    #!/usr/bin/perl
    use strict; use warnings;
     
    my @liste = ( '0'..'9','a'..'z' );
     
    sub gen_comb {
      my $depth = shift;
      my $begin = shift;
      my @chars = @_;
     
      if( $depth > 0 ){
        foreach my $char (@chars){
          gen_comb( $depth - 1, $begin . $char, @chars );
        }
      } else {
        print $begin, "\n";
      }
    }
     
    gen_comb 4, '', @liste;
    gen_comb() est une fonction généraliste, qui peut faire ce que tu demandes mais pour une profondeur quelconque et une liste de caractères arbitraires.

    (à noter que je ne vois pas pourquoi tu as dû 'changer de langage', vu que ta version en tcl peut-être réécrite à l'identique en Perl...en plus lisible)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    my @liste = ( '0'..'9','a'..'z' );
     
    my ($c1, $c2, $c3, $c4);
    for $c1 (@liste){
      for $c2 (@liste){
        for $c3 (@liste){
          for $c4 (@liste){
            print $c1,$c2,$c3,$c4,"\n";
          }
        }
      }
    }
    A noter que cette version est nettement plus rapide que la mienne, car il n'y a pas d'appel récursif. Mais on y perd énormément en réutilisabilité.

    Pour conjuguer les avantages des deux solutions, on peut profiter de la nature dynamique de Perl :
    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
     
    ## Troisième version
    # Evaluation de boucles générées par appels récursifs (rapide et généraliste)
    sub gen_loops {
      my $ini_depth = shift;
      my @chars = @_;
     
      sub aux_loops {
        my $depth = shift;
        my $ini = shift;
        if ($depth > 0){
          return 
          ' ' x (($ini - $depth) * 2).
          "for \$c$depth (\@chars) {\n".
            &aux_loops( $depth - 1, $ini ).
          ' ' x (($ini - $depth) * 2).
          "}\n";
        } else {
          return ' ' x (($ini + 1) * 2).
          "print ".
            join(',',(map {'$c'.$_} reverse (1..$ini))).
            ",\"\\n\";\n";
        }
      } 
     
      my $eval_loops = "my (".
        join(',',(map {'$c'.$_} reverse (1..$ini_depth))).
        ");\n".
        aux_loops( $ini_depth, $ini_depth );
     
      print $eval_loops;
      eval $eval_loops;  
    }
     
    gen_loops 4, @liste;
    --
    Jedaï

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 42
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par Jedai
    Euh... Tu trouves ça joli et lisible ?

    Jedaï
    Je le trouve tres lisible .. evidemment le saut de ligne n'est pas present en plien milieu .. c'est le forum qui l'a rajoute

    Sinon merci pour le script en perl

    Citation Envoyé par Jedai
    (à noter que je ne vois pas pourquoi tu as dû 'changer de langage', vu que ta version en tcl peut-être réécrite à l'identique en Perl...en plus lisible)
    Je ne connaissais pas les listes en perl .. juste en tcl alors j'ai fait avec mes connaissances lol

  5. #5
    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
    Citation Envoyé par perldebutant
    Citation Envoyé par Jedai
    Euh... Tu trouves ça joli et lisible ?

    Jedaï
    Je le trouve tres lisible .. evidemment le saut de ligne n'est pas present en plien milieu .. c'est le forum qui l'a rajoute
    Ce que je trouve vraiment pas lisible c'est ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    "[lindex $liste $i][lindex $liste $j][lindex $liste $k][lindex $liste $l]"
    Mais bien sûr, c'est une question d'habitude.
    (NB : Dans ma résolution d'écran, il n'y a pas eu rajout de saut de ligne, je n'ai donc pas été influencé par cela)

    Bien sûr ma troisième version est purement illisible... Mais c'est la plus puissante du lot.

    --
    Jedaï

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

Discussions similaires

  1. Aide pour un petit programme
    Par multeamage dans le forum C++
    Réponses: 13
    Dernier message: 19/08/2006, 17h36
  2. Besoin d'aide pour un petit programme
    Par Nico35 dans le forum C
    Réponses: 13
    Dernier message: 25/05/2006, 22h21
  3. Aide pour modification de script
    Par cryptorchild dans le forum Langage
    Réponses: 3
    Dernier message: 04/10/2005, 15h59
  4. Besoin d'aide pour faire un script
    Par shinux2004 dans le forum Langage
    Réponses: 4
    Dernier message: 16/07/2005, 16h44

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