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 :

Interpréter un parametre en motif


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de mensoif
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 248
    Par défaut (resolu) Interpréter un parametre en motif
    Bien le bonjour,
    pour une analyse syntaxique j'utilise les fonctions index, substr etc. La chose est que j'aurais aimé passer directement des motifs à ces fonctions.

    J'ai essayé les formulations suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my $phrase = "bonjour blabla\n";
     
    my $pos = index ($phrase, /$pat/, 0); # avec comme init my my $pat = "bla";
    my $pos = index ($phrase, $pat, 0);    # avec comme init my $pat = /bla/;
    Sachant que je fais appel à index et substr dans une fonction, il faut donc que je lui passe les motif en paramètre et qu'il soit interprété localement par ces fonctions et pas avant.

    J'espère avoir été assez clair. Merci

  2. #2
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $pos = index ($phrase, $pat, 0);    # avec comme init my $pat = /bla/;
    Je ne comprends pas ce que tu veux faire exactement ... pourquoi utiliser des slash? Pourquoi mettre 0 en troisième argument de la fonction indexe? Ou est le substring?

    Est-ce juste le faite de passer un argument à ta fonction qui pose problème ou est-ce la façon dont utiliser indexe() et subtr()?

  3. #3
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    une expression régulière ne ferait-elle pas ce que tu veux?
    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
    #!/usr/local/bin/perl
     
    use strict;
    use warnings;
     
     
    my $phrase = "bonjour blabla\n";
     
    my $pat = 'bla';
     
     
    if ($phrase =~ m/^(.*?)($pat)(.*)$/){
     
    	my $start = $1;
    	my $pos_pat = $-[2];
    	my $end = $2;
     
    	print "$start\n$pos_pat\n$end\n";
    }
    bonjour
    8
    bla

  4. #4
    Membre éclairé Avatar de mensoif
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 248
    Par défaut
    Citation Envoyé par Jasmine80 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $pos = index ($phrase, $pat, 0);    # avec comme init my $pat = /bla/;
    Je ne comprends pas ce que tu veux faire exactement ... pourquoi utiliser des slash? Pourquoi mettre 0 en troisième argument de la fonction indexe? Ou est le substring?

    Est-ce juste le faite de passer un argument à ta fonction qui pose problème ou est-ce la façon dont utiliser indexe() et subtr()?
    Je vais commencer par te répondre. J'ai mis des slash parce que en faisant ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( $regexp =~ /$pattern/ )
    Je pouvais utiliser le contenu de la variable pattern comme motif. C'est pour cela que j'ai tester les paramètres avec les slashs.

    Pour ce qui est de la suite, désolé mais j'ai voulus simplifier mon code ( un peu trop d'ailleurs :p).

    Le problème est un peu plus compliqué en réalité.

    voici la fonction appellée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    sub chunker {
    	my ($starttok,$endtok,$where,$str) = @_;
     
    	# renvoie la position 
    	my $startcut = index($str, $starttok, $where) + length($starttok);
    	my $endcut = index($str, $endtok, $startcut+1);
    	my $returner = substr ($str, $startcut, $endcut - $startcut);
    	my @res = ($endcut,$returner);
    	return @res;
    }
    Fonction que j'appelle comme cela :

    et où la variable tok_1_beg contient, par exemple, un string indiquant ce qui précede l'url par exemple, et $tok_1_end indique le string qui marque la fin de l'url. Ce code me permet ainsi de récuperer trois informations que je stocke dans tok1, tok2 et tok3.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		($pos, $tok1) = chunker($tok_1_beg, $tok_1_end, 0, $chunk);
    		($pos, $tok2) = chunker($tok_2_beg, $tok_2_end, $pos, $chunk);
    		($pos, $tok3) = chunker($tok_3_beg, $tok_3_end, $pos, $chunk);

    Ma volonté est de faire passer, à la place de string pur (rigide à l'utilisation) des expressions régulières. Et le problème vient ensuite de l'intèrprétation de ces reg exp, car index et substr ne les interpretent pas.

    Tous de suite ca devient un peu plus indigeste, mais j'espère que c'est plus clair dans ton esprit. Merci tous de même de te pencher sur mon topic

  5. #5
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Sans un exemple avec des valeurs concrètes de positions et de motifs recherchés, c'est difficile de te réponde. Une expression régulière devrait néanmoins rendre cette recherche bien plus simple.
    Regarde si le code que je t'ai précédemment donné ne peut pas te servir.

  6. #6
    Membre éclairé Avatar de mensoif
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 248
    Par défaut
    D'accord, je vais tester ça., malheureusement pas tout de suite.. j'ai masse de truc à faire, je me bouge pour essayer de le test avant la fin d'aprem. Merci à toué.

  7. #7
    Membre éclairé Avatar de mensoif
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 248
    Par défaut
    Erf, j'ai eu un contre-temps.. mais je reviens avec tous plein d'info !! =)

    Alors j'ai commencer à retranscrire un peu tout ca, j'annonce c'est gore :
    Je trouve d'ailleurs cela étrange, je dois passer devant quelque chose car le seul fait de vouloir utiliser des expressions rationnelles dans les fonctions index transfrome tous cela en monstre difforme...

    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
     
    sub cutteregexp {
    	my ($starttok,$endtok,$where,$old_str) = @_;
     
    	my @res = ();
     
     
    	my $startcut;
      # substr sans l'elements length (permet ainsi de slectionner toute la partie à droite de l'offset)
    	my $str = substr ($old_str, $where);
    		# est ce que le fait de mettre $- [0] pour /($motif)/ m'assure bien que j'ai la premiere occurence 
    		# pattern entier
      	if ( $str =~ m/($starttok){1}?/ ) {
    # pas totalement exact mais vaut 0 pour le premier des appels.
    		print "[0] = ".$- [0]."\n";
    		$startcut = $- [0] + length ($starttok);
    	}
     
    	print '$startcut vaut '.$startcut."\n";
     
    	my $endcut;
    	$str = $'; #' str prend pour valeur toute la sous-chaine 
    		       # qui suit la sous-chaine matchante
      	if ( $str =~ m/($endtok){1}?/ ) {
    		$endcut = $-[1] + $startcut ;
    		print "[0] = ".$- [0]."\n";
     
    	}
     
    	print '$endcut vaut '.$endcut."\n";
     
    	my $returner = substr ($old_str, $startcut, $endcut);
     
    	print '$returner vaut '.$returner."\n";
    	push @res, $endcut;
    	push @res, $returner;
    	return @res;
     
    }
    qui devrait être l'équivalent de

    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
     
    sub cutter {
    	my ($starttok,$endtok,$where,$str) = @_;
    	# renvoie la position 
    	my $startcut = index($str, $starttok, $where) + length($starttok);
    	my $endcut = index($str, $endtok, $startcut+1);
    	my $returner = substr ($str, $startcut, $endcut - $startcut);
    	my @res;
     
    	print '$startcut vaut '.$startcut."\n";
    	print '$endcut vaut '.$endcut."\n";
    	print '$returner vaut '.$returner."\n";
     
     
    	push @res, $endcut;
    	push @res, $returner;
    	return @res;
    }
    malheureusement, je n'ai pas un affichage totalement adéquat. ^o)

    Ensuite pour éclairer un peu le code, je vous propose un exemple assez basic qui illustre bien l'utilisation.



    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
    55
    56
    57
    58
    59
    60
     
    #!/usr/bin/env perl
     
    use strict;
    use warnings;
     
    sub cutter { ... }
     
     
    sub cutteregexp { ... }
     
    my $path_file = "search_google.html";
     
    open (TXT_FILE, "<$path_file"); 
    my $result;
    while (<TXT_FILE>) {
    	$result .= $_;
    }
    close (TXT_FILE);
    my ($beg, $pos, $end) = 0;
     
    while (1) {
     
    	my ($snippet, $url, $summary, $heading) = "";
     
    	my $tok1 = "<a href=\"";
    	my $tok2 = "\"";
    	my $tok3 = ">";
    	my $tok4 = "</a>";
    	my $tok5 = "<font size=-1>";
    	my $tok6 = "<br>";
        my $google_tok = "<li class=g>";
     
    	# on releve l'intervalle du prochain snippet de code
    	$beg = index($result, $google_tok, $beg);
    	$end = index($result, $google_tok, $beg + 1);
     
    	# test si une occurence du mot clef a bien été trouvé, sinon sort
    	if ($beg == -1 || $end == -1 || $beg == $end) {
    		last;
    	}
     
            # where $result est par exemple le html d'une recherche google !! 
    	# déclaration : bout de code, sa position, et les champs à extraire
    	$snippet = substr($result, $beg, $end - $beg);
     
    # appelle de la fonction qui traite les chaine simple
    	($pos, $url) = cutter($tok1,$tok2, 0, $snippet);
    	($pos, $heading) = cutter($tok3, $tok4, $pos, $snippet);
    	($pos, $summary) = cutter($tok5, $tok6, $pos, $snippet);
     
    # appelle de la fonction qui traite les chaines contenant des expressions régulieres
    #	($pos, $url) = cutteregexp($tok1,$tok2, 0, $snippet);
    #	($pos, $heading) = cutteregexp($tok3, $tok4, $pos, $snippet);
    #	($pos, $summary) = cutteregexp($tok5, $tok6, $pos, $snippet);
    	print "Title   : ".$tok2."<br>";
    	print "content : ".$tok3."<br>";
    	print "URL     : ".$tok1."<br>";
    	$beg = $end;
    }
    Qui permet d'afficher les résultats, resumés et titre si le fichier analysé est un source html d'une page du moteur de recherche Google.

    Je vais continuer à essayer de le rendre juste. Je posterais les avancées.

  8. #8
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Regarde encore une fois sur le CPAN ... ça serait mieux de trouver le module adéquat ! HTML-Parser, XML-Twig



    Voici quelques expressions régulières ... peut-être peux-tu les regrouper afin d'éviter de parcourir 4 fois ton fichier.
    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
    open my $file , '<', 'search_google.html'
      or die $!;
    my $result = do { local $/; <$file> };
    close $file;
     
    # mise sur une seule ligne de $result
    $result =~ s/\n//g;
     
     
    # tant que le mot clé est trouvé dans $result
    # entre >...<br>
    while ( $result =~ m{([^>]+)<br>}g){
    	my $summary = $1; print "$summary\n";
    }
     
    # tant que le mot clé est trouvé dans $result
    # entre >...</a>
    while ( $result =~ m{([^>]+)</a>}g){
    	my $heading = $1;
    }
     
    # tant que le mot clé est trouvé dans $result
    # entre <a href=\"..."
    while ( $result =~ m{<a href=\"(.*?)\"}g){
    	my $url = $1; 
    }
     
    # tant que le mot clé est trouvé dans $result
    # entre <li class=g>...<li class=g>
    while ( $result =~ m/<li class=g>(.*?)<li class=g>/g){
    	my $snippet = $1;
    }
    NB : les positions de début et de fin des motifs trouvés sont sockeés dans les variables $-[1] et $-[+1].

  9. #9
    Membre éclairé Avatar de mensoif
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 248
    Par défaut
    Et bien il a pinnaillé le fofo hier *-)

    Pour en revenir au sujet, j'ai pensé à cela ( même si cela demandera surement certaine modifications )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while ($content =~ m/<h3 class=r>(.*)?<h3 class=r>/g ) {
     
    	    while ($1 =~ /$tok_1_beg(.*)$tok_1_end.*$tok_2_beg(.*)$tok_2_end.*$tok_3_beg(.*)$tok_3_end/){  			 
                       ($tok1,$tok2,$tok3) = ($1,$2,$3);
                       # traitement
                 }
    }
    Et je pense que je me baserais la dessus par la suite. Le problème (l'en fallait bien un ) résidant dans le fait que pour faire la cesure ( le premier while ) je me confronte au problème de la gourmandise des reg exp. J'ai eu beau cherche, je n'arrive pas à trouver le modificateurqui fait en sorte que les l'expression regulière soit non gourmande ( mais pas dans le sens des quantificateur). Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $phrase = "bonjour je suis grand bonjour pas moi bonjour";
    if ($phrase =~ /bonjour(.*)bonjour/g ) {
        print $1;
    }
    Cela m'affiche
    je suis grand bonjour pas moi
    alors que je souhaiterais avoir
    je suis grand
    J'ai un peu tripoter tous, regarder un peu partout j'ai rien trouvé :o


    Et en ce qui concerne les modules, je suis assez rétissant à utiliser certains, en effet la (ou les ^o) couche objet rajouté est un factère qui augmente temps éxecution et mémoire, le tout pour se faciliter la progra du script. (j'utilise des modules surtout pour ce qui concerne les socket et autre)

  10. #10
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Citation Envoyé par mensoif Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ($content =~ m/<h3 class=r>(.*)?<h3 class=r>/g ) {
    J'ai eu beau cherche, je n'arrive pas à trouver le modificateur
    qui fait en sorte que les l'expression regulière soit non gourmande
    ^^ voila pourquoi j'utilise un ? après l'astérique dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while ( $result =~ m{<a href=\"(.*?)\"}g){
    	my $url = $1; 
    }
    ... mais ton point d'interrogation semble s'être échappé de tes parenthèses

  11. #11
    Membre éclairé Avatar de mensoif
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 248
    Par défaut
    Oui, en effet, shame on me pour le coup !!

    Bon, j'ai eu assez d'info, je vais mettre ce post en résolu ! ( même si la question de base avec index ne l'est pas :p)

    Merci beaucoup Jasmine !

  12. #12
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Citation Envoyé par mensoif Voir le message
    Bon, j'ai eu assez d'info, je vais mettre ce post en résolu ! ( même si la question de base avec index ne l'est pas :p)
    On va quand même pas t'aider à écrire un code complètement tordu pour le plaisir alors que c'est si simple avec des EXPREG

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

Discussions similaires

  1. [VB6] [Graphisme] Floodfill et motif
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 03/12/2002, 09h35
  2. [VB6] Transférer ".picture" en paramètre
    Par Ricou13 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 19/11/2002, 08h43
  3. [VB6] [ADO] Procedure stockée : spécifier les paramètres
    Par adepdoom dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 16/10/2002, 10h45
  4. Passage de parametre a une anim Flash 5
    Par debug dans le forum Intégration
    Réponses: 4
    Dernier message: 03/06/2002, 17h59
  5. transmision de tableau en parametre
    Par Horus dans le forum C++Builder
    Réponses: 3
    Dernier message: 16/05/2002, 11h15

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