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 :

Expression Régulière PERL


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 41
    Points : 29
    Points
    29
    Par défaut Expression Régulière PERL
    Bonjour à tous,

    je débute en PERL et j'ai un problème avec une expression régulière, malgré la documentation, je ne comprends pas bien comment ça marche :

    Alors en fait, dans un fichier CSV, j'ai une liste complète d'oiseaux. Ce que j'ai fait pour le moment, c'est donc ouvrir le fichier, parcourir le fichier pour insérer chaque nom d'oiseau dans une liste, trier la liste, mettre chaque élément de la liste dans une liste déroulante, et l'afficher.

    Maintenant, j'essaye de reprendre ce principe pour n'afficher que les oiseaux commençant par une certaine lettre, donc je reparcours ma liste d'oiseaux, et si ça commence par une certaine lettre, j'insère la valeur dans une seconde liste, je construis ma liste déroulante et je l'affiche.

    Le problème c'est que je n'arrive pas à bien gérer mon expression régulière.

    J'ai mis ça en condition :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($birds[$i] =~/^[aA]/)
    qui me retourne bien tous les oiseaux commençant par la lettre a ou la lettre A

    mais si j'essaye avec la lettre suivante, b, et que je mets donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($birds[$i] =~/^[bB]/)
    , là j'ai les A et les B ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($birds[$i] =~/^[cC]/)
    , là j'ai aussi que les A et les B ...

    donc je ne vois pas ce qui cloche

    voici mes qq lignes de mon script :

    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
    37
    38
    39
    40
    #!/usr/bin/perl
     
    print "Content-type: text/html\n\n";
     
    open (FICHIER,"liste.csv") or print("Le fichier n'existe pas !");
    @birds = ();
    my $form;
    while ($ligne = <FICHIER>){
        chomp($ligne);
    	push (@birds,$ligne);
    }
    @birds=sort(@birds);
    close FICHIER;
     
    my $longueur = @birds;
    for($i=0;$i<$longueur;$i++)
    {
        $form=$form."<option value='@birds[$i]'>@birds[$i]</option>";
    } 
    $listfinale="<form method='post'><select name='birds'>" .$form."</select></form>";
    print $listfinale;
     
    @birdsspec=();
    $form="";
    for($i=0;$i<$longueur;$i++)
    {
    	if ($birds[$i] =~^[\aA]/)
    	{ 
    		push(@birdsspec,$birds[$i]);
    	}
    }
    my $longueur = @birdsspec;
    for($i=0;$i<$longueur;$i++)
    {
        $form=$form."<option value='@birds[$i]'>@birds[$i]</option>";
    } 
     
    $listfinale="";
    $listfinale="<form method='post'><select name='birds'>" .$form."</select></form>";
    print $listfinale;
    Merci à tous ceux qui pourront me dépanner

    Slyv

  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
    Que se passe-t-il avec ce 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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    #!/usr/bin/perl 
     
     print "Content-type: text/html\n\n"; 
     
     open (FICHIER,"liste.csv") or print("Le fichier n'existe pas !"); 
     @birds = (); 
     my $form; 
     while ($ligne = <FICHIER>){ 
         chomp($ligne); 
        push (@birds,$ligne); 
     } 
     @birds=sort(@birds); 
     close FICHIER; 
     
     my $longueur = @birds; 
     for($i=0;$i<$longueur;$i++) 
     { 
         $form=$form."<option value='@birds[$i]'>@birds[$i]</option>"; 
     } 
     $listfinale="<form method='post'><select name='birds'>" .$form."</select></form>"; 
     print $listfinale; 
     
     @birdsspec=(); 
     $form=""; 
     for($i=0;$i<$longueur;$i++) 
     { 
        if ($birds[$i] =~ /^b/i) 
        { 
           push(@birdsspec,$birds[$i]); 
        } 
     } 
     my $longueur = @birdsspec; 
     for($i=0;$i<$longueur;$i++) 
     { 
         $form=$form."<option value='@birds[$i]'>@birds[$i]</option>"; 
     } 
     
     $listfinale=""; 
     $listfinale="<form method='post'><select name='birds'>" .$form."</select></form>"; 
     print $listfinale;
    ??

    --
    Jedaï

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 41
    Points : 29
    Points
    29
    Par défaut
    J'ai alors la liste des a et des b.

    Et pourtant, y'a même pas la lettre b dans les 3 premiers noms d'oiseaux, au cas où le filtrage avec ^ne marcherait pas

    Les 3 premiers noms d'oiseaux en "a" étant :

    Arctic Skua
    Arctic Tern
    Avocet

    Slyv

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 46
    Points : 49
    Points
    49
    Par défaut
    Bonjour

    Plusieurs remarques concernant ton code :

    Premièrement,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for($i=0;$i<$longueur;$i++)
    {
        $form=$form."<option value='@birds[$i]'>@birds[$i]</option>";
    }
    comme tu veux rajouter le contenu du tableau @birds pour chaque indice, on est en contexte scalaire donc il faut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        $form=$form."<option value='$birds[$i]'>$birds[$i]</option>";
    Deuxièmement,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for($i=0;$i<$longueur;$i++)
    {
       if ($birds[$i] =~^[\aA]/)
       {
          push(@birdsspec,$birds[$i]);
       }
    }
    la regex devrait plutôt ressembler à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     if ($birds[$i] =~ /^[aA]/)
    Ce qui correspond à tout ce qui commence par "a" ou "A".

    Troisièmement,
    tu places tes oiseaux commençant par "a" ou "A" dans @birdsspec mais plus loin tu lis @birds, il ne t'affichera donc jamais @birdsspec !!!!

  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
    Oui désolé de n'avoir pas remarqué cette erreur, mais j'avais assumé que tu avais vérifié le reste de ton code...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     my $longueur = @birdsspec; 
     for($i=0;$i<$longueur;$i++) 
     { 
         $form=$form."<option value='@birds[$i]'>@birds[$i]</option>"; 
     }
    Ca ne risque pas de marcher !!

    --
    Jedaï

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 46
    Points : 49
    Points
    49
    Par défaut
    En fait, cela m'a intrigué, et j'ai fais un test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my @f=("a","b","c");
    print @f[0].@f[1].@f[2]."\n";
    Si tu ne mets pas l'option "-w" dans le shebang, cela fait ce que tu attends :
    Avec l'option "-w", Perl t'envoi un warning suivi du résultat attendu !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Scalar value @f[0] better written as $f[0] at ./test.pl line 5.
    Scalar value @f[1] better written as $f[1] at ./test.pl line 5.
    Scalar value @f[2] better written as $f[2] at ./test.pl line 5.
    abc
    Donc dans le code de slyv, ce n'est pas ceci qui pose soucis. J'opte plus pour ma troisième remarque !!!

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 41
    Points : 29
    Points
    29
    Par défaut
    Bonjour,

    merci a tous, je suis maintenant a la fac (sur un clavier anglais donc pas d accent), et mon script marche desormais parfaitement

    j ai la meme expression reguliere qu'hier mais dans mon option value, je rajoute effectivement birdsspec et non birds

    g essaye avec les a,b,c,d et c bon

    Je vais avoir mon premier cours de perl la donc ca devrait biem m@aider pour la suite des evenements ... dans la realisation de mon projet

    Bonne continuation

    slyv

  8. #8
    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 strach
    En fait, cela m'a intrigué, et j'ai fais un test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my @f=("a","b","c");
    print @f[0].@f[1].@f[2]."\n";
    Si tu ne mets pas l'option "-w" dans le shebang, cela fait ce que tu attends :
    Avec l'option "-w", Perl t'envoi un warning suivi du résultat attendu !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Scalar value @f[0] better written as $f[0] at ./test.pl line 5.
    Scalar value @f[1] better written as $f[1] at ./test.pl line 5.
    Scalar value @f[2] better written as $f[2] at ./test.pl line 5.
    abc
    Le @f[0] n'est pas en soi incorrect car il s'agit d'une "slice" (tranche) de tableau à un seul élément. Il se comporte donc comme une liste à un élément, et dans certain cas ce comportement coïncide avec celui d'un scalaire. Mais ce n'est pas toujours le cas, essayez donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my @f = (1, 2, 3); $f[2] = (5, 6); print @f;
    Ce n'est pas le même résultat que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my @f = (1, 2, 3); @f[2] = (5, 6); print @f
    Employer le $ est donc préférable pour s'assurer des résultats cohérents.

    (En Perl6, cette logique sera revue en profondeur, de sorte que l'utilisation des références ne soit plus en parfaite contradiction avec le reste de la syntaxe des sigils, comme c'est le cas actuellement).

    --
    Jedaï

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 46
    Points : 49
    Points
    49
    Par défaut
    Merci de ces éclaircissements !!

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

Discussions similaires

  1. Expression régulière perl
    Par Isabella83 dans le forum Langage
    Réponses: 3
    Dernier message: 21/04/2015, 18h57
  2. [Perl]Expression régulière .
    Par Premium dans le forum Langage
    Réponses: 1
    Dernier message: 06/07/2009, 15h43
  3. Expressions régulières en perl
    Par flo_k dans le forum Langage
    Réponses: 2
    Dernier message: 06/11/2007, 19h54
  4. Réponses: 6
    Dernier message: 30/05/2007, 17h31
  5. [Noob] Formation rapide à Perl - Expressions régulières
    Par Konrad Florczak dans le forum Langage
    Réponses: 16
    Dernier message: 25/09/2006, 14h48

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