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 :

[langage] expression regulier et test


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 30
    Points : 35
    Points
    35
    Par défaut [langage] expression regulier et test
    Salut,

    J ai un probleme sur des tests avec des expressions regulieres et je ne comprend pas comment perl fonctionne.
    Alors,
    J'ai un tableau a 2 dim que je parcourt et des qu'il y a un '|--' dans une case je veux afficher le contenu de cette case , ca ne parait pas compliquer. Ce que je ne comprend pas c'est que parfois il n y a pas '|--" et le programme m affiche quand meme la case.

    Voici le bout de code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (; $posi <= $#ftab; $posi++){
    if ($ftab[$posi][$posy] =~ '|--'){
    print "*****$posi,$posj =$ftab[$posi][$posj]\n";}}
    Et maintenat voici, un bout du resultat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    *****3,2 =|--2.12662
    *****4,2 =|--0.652078
    *****5,2 =|--1.15812
    *****6,2 =user_args    #probleme
    *****7,2 =100  #problem
    Et le programme affiche entierement le tableau(la colonne souhaitee) jusqu'a la fin.
    Il doit y a voir un problem de match mais je ne comprend pas pourquoi le programme affiche tout comme s'il n y avait pas de if


    Merci de me donner un coup de main..

  2. #2
    Membre expérimenté
    Avatar de nyal
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    622
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 622
    Points : 1 428
    Points
    1 428
    Par défaut
    Bonjour,

    Tu t'es simplement tromper dans la syntaxe.
    C'est plutot :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if ($ftab[$posi][$posy] =~ /\|--/) {
    Sinon en voyant ton bout de code je trouve l'utilisation d'un tableau a deux dimensions inutil. Mais ca peut servir autre part dans le code

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 30
    Points : 35
    Points
    35
    Par défaut
    Merci, mais ca marche pas fort...Car je te t ai pas tout dit
    Je suis preneur si il y a une autre methode que l utilisation d'un tab[][]
    J en utilise un car je split un fichier (que j ouvre) suivant '|' et ensuite je fait des tests sur les cases...
    Exemple d'un fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    --98.9703 user 0 1
    |  |--99.669 main 0 1
    |  |  |--96.0632 titit 100 1
    |  |  |--2.12662 totot 100 1
    |  |  |--0.652078 ococ 100 1
    |  |  |--1.15812 gogogo 100 1
    |  |--0.331025 fififif 100 1
    |--1.02971 lololol 100 1
    Une petite explication, main lance titi, toto, ococ, gogogo
    Je cherche recuper main et a trouver quelle fonctions sont lancees par main.
    Le but du script est de trouver toutes les fonctions qui lancent d autres fonctions, de les lister et recuperer les infos qui sont sur la meme ligne que le nom de la fonction.
    Et j avoue j ai un peu de mal avec perl........Merci pour le coup de main....

  4. #4
    Membre expérimenté
    Avatar de nyal
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    622
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 622
    Points : 1 428
    Points
    1 428
    Par défaut
    Bon j'avais un peu de temps.
    Voici un script qui devrait enormement t'aider.
    Il reconstitue ta structure de donnee :
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    #! /usr/bin/perl -w
     
    use strict;
     
    sub level {
        my $value_arbre = $_[0];
        my $fd          = *FD;
        my $level       = $_[1];
     
        while (<$fd>) {
            my $level_tmp = 0;
            my @tabl = split(/(\| )/, $_);
            foreach my $tmp (@tabl) {
                if ($tmp =~ /\| /) {
                    $level_tmp++;
                }
            }
            /([A-Za-z]{1,})/;
            my $name = $1;
            if ($level_tmp == $level) {
                push(@$value_arbre, $name);
            } else {
                if ($level_tmp < $level) {
                    return ($name);
                }
                ${$value_arbre}[$#$value_arbre + 1] = [$name];
                my $value_ret = level(\@{${$value_arbre}[$#$value_arbre]}, $level_tmp);
                push(@$value_arbre, $value_ret);
            }
        }
    }
     
    sub aff_arbre {
        my $arbre = $_[0];
        my $level = $_[1];
     
        foreach my $value (@$arbre) {
            if (defined(@$value)) {
                aff_arbre(\@$value, $level + 1);
            } else {
                for (my $i = 0; $i < $level; $i++) {
                    print "---";
                }
                print "$value\n";
            }
        }
    }
     
    our @arbre = ();
    open FD, $ARGV[0];
    level(\@arbre, 0);
     
    aff_arbre(\@arbre, 0);
    Il n'est pas tres simple. Et il marche avec le fichier que tu m'as donnee.
    Il te reste plus qu'a implementer une fonction de recherche.
    Tu as une fonction de stockage du fichier et d'affichage.

  5. #5
    Membre expérimenté
    Avatar de nyal
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    622
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 622
    Points : 1 428
    Points
    1 428
    Par défaut
    Bon voici la fonction de recherche dans l'arbre :
    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
     
    sub search_elem {
        my $arbre = $_[0];
        my $elems = $_[1];
        my $identif = $_[2];
        my $profondeur = $_[3];
        my $have    = $_[4];
        my $level   = $_[5];
     
        if (!defined($_[4])) {
            $have = 0;
        }
        if (!defined($_[5])) {
            $level = 0;
        }
        foreach my $value (@$arbre) {
            if (defined(@$value)) {
                search_elem(\@$value, \@$elems, "main", $profondeur, $have, $level + 1);
            } else {
                if ($have == $level) {
                    $have = 0;
                }
                if ($have && ($have + 1 + $profondeur) >= $level) {
                    push @$elems, $value;
                }
                if ($value eq $identif) {
                    $have = $level;
                }
            }
        }
    }
    Et voici comment on l'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    my @elems = ();
    search_elem(\@arbre, \@elems, "main", 1);
     
    print "#####\n";
    foreach my $value (@elems) {
        print $value . "\n";
    }
    Les arguments :
    ---> 1 : Le tableau qui est rempli grace a la fonction level
    ---> 2 : Un tableau vide
    ---> 3 : Le mot de recherche
    ----> 4 : La profondeur. Si la valeur est zero alors on prend les fonctions se trouvant dans la fonction voulue. 1 on prend les fonctions du niveau en dessous. Ainsi de suite.

    La fonction va avoir un probleme si le critere de recherche se trouve a plusieurs endroits.
    Tu peux transformer ces fonctions en un objet unique.

    Si tu as des problemes de comprehensions sur ces fonctions, n'hesite surtout pas a demander.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 30
    Points : 35
    Points
    35
    Par défaut
    Super merci....

    Je n ai pas encore teste, mais si tu dis que ca marche ca doit bien marcher... Je verrai ca demain, c'est la fin de la journee
    En perl c'est vrai qu il y a plusieurs facon de faire, mais je remarque que mon code est beaucoup plus proche du C que du perl

    En plus de m'avoir donne un scipt qui marche tu m as passe un bon exemple de la facon de "parler en perl".
    Il y a pas mal truc que je ne pige pas (comme le fait de mettre des [] autour d'une variable.....) mais je vais tenter de tout eclaircir ca va me faire un bon exercice

    Encore merci et bonne soiree


    A+


    PS : c'est la fete, j ai vu la fonction de recherche apres avoir poster ce post... MERCI

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 22/12/2003, 15h23
  2. [langage] [expression reguliere] : syntaxe
    Par arcane dans le forum Langage
    Réponses: 8
    Dernier message: 25/09/2003, 13h03
  3. [langage] [Expression][Régulière] motif
    Par Cyspak dans le forum Langage
    Réponses: 4
    Dernier message: 23/09/2003, 14h24
  4. Réponses: 2
    Dernier message: 16/06/2003, 15h15
  5. [langage] expression reguliere motif répétitif dans 1 pattern
    Par comme de bien entendu dans le forum Langage
    Réponses: 11
    Dernier message: 09/04/2003, 16h14

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