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 :

[regex]Problème pour récupérer les caractères d'une chaine


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 21
    Points : 15
    Points
    15
    Par défaut [regex]Problème pour récupérer les caractères d'une chaine
    Salut à tous
    Voila j'ai un petit souci pour récupérer les caractères d'une chaine.
    En fait, je génère avec mon script un code composé de 6 chiffres à l'aide de la fonction rand().
    Et ce que je souhaiterai, c'est récupérer un à un les chiffres qui composent ce code. Suis assez clair?
    Prenons l'exemple ou le rand() génère le code 123456
    Et bien je souhaiterais afficher avec un simple print "1,2,3,4,5,6".
    pour cela j'ai fait le code suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    my $code = int(rand(900000)+100000);
    print "le code est $code";
    (my $un,my $deux,my $trois,my $quatre,my $cinq,my $six) = ($code =~ m/^(.)(.)(.)(.)(.)(.)/);
    print "voici mon code : $un,$deux,$trois,$quatre,$cinq,$six";
    mais voila, en reponse, je n'ai rien, si ce n'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    le code est 257916
    voici mon code : ,,,,,
    c'est donc que les variables $un ... sont vides.
    mais pourquoi?

  2. #2
    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
    Ton code est incorrect, tu veux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    my $code = int(rand(900000)+100000);
    print "le code est $code\n";
    my ($un, $deux, $trois, $quatre, $cinq, $six) = ($code =~ m/^(.)(.)(.)(.)(.)(.)/);
    print "voici mon code : $un, $deux, $trois, $quatre, $cinq, $six\n";
    Par ailleurs, il s'agit là d'un code très peu esthétique...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    my $code = int(rand(900000)+100000);
    print "le code est $code\n";
    my @digits = split //, $code;
    print "voici mon code : " . (join ", " , @digits) . "\n";
    Tu continues à avoir accès à chaque digit séparément si tu en as besoin par la suite, mais de façon bien plus propre (et robuste, par exemple si tu change le nombres de chiffres dans ton code).

    --
    Jedaï

  3. #3
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    Merci jedaï
    mais en fait ce que je veux faire c'est recuperer les chiffres pour ensuite pouvoir lancer des fichiers audios.
    En fait j'utilise Asterisk (si quelqu'un connait, et je n'en doute pas), et je veux faire un systeme ou l'utilisateur appelle pour obtenir un code personnel.
    le code est donc généré avec rand() et je veux ensuite que mon serveur telephonique dicte ce code chiffre pr chiffre, sachant que le fichier audio disant "1" s'appelle '1.wav'.
    j'imagine que mes explications sont loin d'etre claires et je m'en excuse...
    si on prend un exemple simple:

    je genere le code 12
    je veux que le serveur dise "1" puis "2", c'est a dire qu'il lance le fichier audio "1.wav" puis "2.wav".
    donc pour cela je veux stocker le premier chiffre dans une variable $un, puis le deuxieme dans la variable $deux.comme ca on lance le lecteur audio avec en parametre $un puis $deux et le tour est joue...en theorie

  4. #4
    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
    $un est juste la même chose que $digits[0] dans mon code. (Avoir des variables $un $deux etc est un très mauvais signe pour le design d'une application, et trahit la plupart du temps un programmeur venus tout droit du basic ou équivalent, ce n'est pas vraiment une pratique recommandée)
    Néanmoins tu peux tout à fait utiliser la version corrigée de ton code plutôt que ma proposition d'amélioration (bien que je ne te le conseille pas : les tableaux sont bien plus flexibles et propres).

    --
    Jedaï

  5. #5
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    Bon merci Jedai, mais maheureusement quelque soit la methode utilisee, le probleme est toujours present, a savoir que je reste incapable de recuperer mon code chiffre par chiffre.
    Le probleme peut il venir du fait que $code est cree a l'aide de rand?
    (attention cette question m'a peut etre trahi, mais oui je suis nul en prog )

  6. #6
    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
    J'ai déjà eu des problèmes avec les regexp inopérantes sur des nombres. La solution que j'ai trouvé a été de passer par une chaine de caractères...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $code = sprintf("%d", (int(rand(900000)+100000)));
    Mais là, en l'occurence, le code de Jedai fonctionne sans modification. quand tu l'executes, quel résultat obtiens-tu ?

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

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

  7. #7
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    Merci bien, mais encore une fois cette methode ne fonctionne pas
    j'obtiens inlassablement (quoi que...) et eternellement lameme reponse, du moins les memes message dans ma console, a savoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    le code est 257916
    voici mon code : ,,,,,
    et je dois admettre que je me demande quel peut en etre la cause
    pour tout vous dire, j'ai un autre script qui ressemble trait pour trait a ca si ce n'est que celui la fonctionne, et me renvoie bien les elements souhaites dans les variables souhaitees
    et j'avoue que si ce n'est pas super chiant et bien ca y ressemble fortement

  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
    Quelle version de Perl utilises-tu ?

    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 à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    j'utilises la version 5.8.4 de perl
    mais je ne suis pas sur que ce soit du a la version puisque dans mon autre script, la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ($un...) = ( $variable =~ m/^(.)(.)(.)(.)/);
    fonctionne parfaitement, a savoir que je recupere bien un chiffre dans $un, un dans $deux, etc.

  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
    Peux tu poster ici le source des 2 scripts pour voir la différence ?

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

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

  11. #11
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    alors le premier qui fonctione le voici

    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
     
    #!/usr/bin/perl
    use DBI;
    use Asterisk::AGI;
    my $AGI = new Asterisk::AGI;
    my %input = $AGI->ReadParse();
     
    # on rentre le numero de la borne que l'on souhaite utiliser
     
    $AGI->exec('Playback','/usr/share/asterisk/sounds/fr/borne');
    my $id_borne = $AGI->get_data('/usr/share/asterisk/sounds/beep',5000,4);
    $AGI->verbose("le numero de la borne est $id_borne\n",1);
     
    # si le numero est conforme (compose de quatres chiffres), on continue
     
    if (length($id_borne) == 4)
            {
     
                    # le numero de la borne est repete pour verification
     
                    (my $un,my $deux,my $trois,my $quatre) = ( $id_borne =~ m/^(.)(.)(.)(.)/);
                    $AGI->exec('Playback','/usr/share/asterisk/sounds/fr/numero_borne');
                    $AGI->exec('Playback',"/usr/share/asterisk/sounds/digits/fr/$un");
                    $AGI->exec('Playback',"/usr/share/asterisk/sounds/digits/fr/$deux");
                    $AGI->exec('Playback',"/usr/share/asterisk/sounds/digits/fr/$trois");
                    $AGI->exec('Playback',"/usr/share/asterisk/sounds/digits/fr/$quatre");
    et le second qui donc ne fonctionne pas

    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
    36
     
    #!/usr/bin/perl
    use DBI;
    use Asterisk::AGI;
    my $AGI = new Asterisk::AGI;
    my %input = $AGI->ReadParse();
    my $numero = $input{'callerid'};
     
    my $code = sprintf("%d", int(rand(900000)+100000));
    print "le code est $code\n";
    $AGI->verbose("votre code confidentiel est le $code\n",1);
    my $dbh = DBI->connect("DBI:mysql:asterisk","root","root");
    my $verif = $dbh->prepare("select code from codes where code=$code");
    $verif -> execute();
    if ($code = $verif->fetchrow)
            {
                    $AGI->set_priority(5);
            }
    else
            {
                    my ($un, $deux, $trois, $quatre, $cinq, $six) = ($code =~ m/^(.)(.)(.)(.)(.)(.)/);
                    my @digits = split (//, $code);
                    print "le code est $digits[0],$digits[1],$digits[2],$digits[3],$digits[4],$digits[5]\n";
                    print "voici mon code : $un,$deux,$trois,$quatre,$cinq,$six\n";
                    $AGI->exec('Playback',"/usr/share/asterisk/sounds/digits/fr/$un");
                    $AGI->exec('Wait','1');
                    $AGI->exec('Playback',"/usr/share/asterisk/sounds/digits/fr/$deux");
                    $AGI->exec('Wait','1');
                    $AGI->exec('Playback',"/usr/share/asterisk/sounds/digits/fr/$trois");
                    $AGI->exec('Wait','1');
                    $AGI->exec('Playback',"/usr/share/asterisk/sounds/digits/fr/$quatre");
                    $AGI->exec('Wait','1');
                    $AGI->exec('Playback',"/usr/share/asterisk/sounds/digits/fr/$cinq");
                    $AGI->exec('Wait','1');
                    $AGI->exec('Playback',"/usr/share/asterisk/sounds/digits/fr/$six");
                    $AGI->exec('Wait','1');
    je n'ai mis ici que les parties susceptibles de vous interesser, le reste n'ayant pas grand chose a voir
    En fait, comme vous l'aurez remarque, la seule difference notable se fait au niveau de la creation de la chaine de chiffres. Donc le probleme pourrait venir du rand(). Si quelqu'un pouvait essayer chez lui pour tester si le probleme est le meme...
    merci d'avance

  12. #12
    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
    Faute de frappe (j'espère) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if ($code = $verif->fetchrow)
    Là tu affecte le résultat de fetchrow() à $code...
    Tu voulais sans doute dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if ($code == $verif->fetchrow)
    ou même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if ($code eq $verif->fetchrow)
    De là vient ton erreur.

    --
    Jedaï

  13. #13
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    je suis honteux...
    desole de vous avoir derange pour une erreur aussi debile, vraiment je m'en veux parceque meme sans etre un expert, j'aurais du trouver
    encore mille excuses

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

Discussions similaires

  1. Problème pour lire les donnée d'une table externe
    Par mardoch dans le forum SQL*Loader
    Réponses: 6
    Dernier message: 17/07/2008, 16h41
  2. Réponses: 12
    Dernier message: 04/03/2007, 11h43
  3. Réponses: 12
    Dernier message: 25/06/2006, 23h24
  4. Réponses: 1
    Dernier message: 07/06/2006, 18h56
  5. Réponses: 10
    Dernier message: 16/11/2005, 08h33

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