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 :

recupérer plusieurs modeles


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Points : 116
    Points
    116
    Par défaut recupérer plusieurs modeles
    Bonjour a tous,

    Une petite question concernant un problème de parcours d'une chaine avec sauvegarde du ou des modèles repérés.
    Je ne connais pas la syntaxe a utiliser pour reconnaitre plusieurs fois le modele dans la chaine, je l'ai fait pour uniquement le premier:

    chaine de test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Loc: 0x0000D8AB   7405 C604 C005 7404 7405 C604 C005 7404
    Script:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    my $param_input  = shift or usage() and die;
    print STDERR "o open $param_input... ";
    open(FIC,"$param_input") or print STDERR "  --> !Cannot open $param_input!\n" and usage() and die;
    while(<FIC>){
        if(/\s+(\w{4})\s+/){
          print "$1\n" ;
        }
    }
    Voila pour sauver le premier mot mais les suivants...

    Autre question, pour parser la totalité d'un repertoire afin d'effectuer le test sur tout les fichiers, je pensais imbriquer 2 whiles mais dans le premier while pour faire le test sur le folder je ne vois pas quoi mettre, y a t il une instruction précise ?

    Merci beaucoup d'avance

  2. #2
    Membre actif

    Profil pro
    Inscrit en
    Août 2009
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 156
    Points : 211
    Points
    211
    Par défaut
    Bonjour,

    Pour ton expression tout simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    open(FIC,"$param_input") or print STDERR "  --> !Cannot open $param_input!\n" and usage() and die;
    while(<FIC>){
        if(/\s+(\w{4})\s+(\w{4})\s+(\w{4})\s+/){
          print "$1\n" ;
          print "$2\n";
          print "$3\n";
        }
    }
    Pour parcourrir un répertoire, un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    opendir(REP,"/home");
    while ($file = readdir(REP)) {
      print $file ."\n";
    }
    closedir(REP);

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Points : 116
    Points
    116
    Par défaut
    Merci beaucoup pour cette réponse,

    Le probleme que j'ai oublié de spécifier dans le premier post (désolé), c'est que le nombre de mot peut etre aléatoire...

    exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Loc: 0x0000XXXX   7405 C604 C005 7404 7405 C604
    Loc: 0x0000XXXX   C604 C604 C005 7404 7405 C604 C005
    Loc: 0x0000XXXX   BA70 C604
    Loc: 0x0000XXXX   7405 C604 AFEF 7404 7405
    Dans ce cas la j'aimerais récupérer tous les mots:
    premiere ligne: 6 mots
    seconde ligne: 7 mots
    troisieme ligne: 2 mots
    quatrieme ligne: 5 mots

    Et la je ne vois pas comment d'une expression réguliere arriver a tous les sauver...

    Merci davance

  4. #4
    Membre actif

    Profil pro
    Inscrit en
    Août 2009
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 156
    Points : 211
    Points
    211
    Par défaut
    Si ton séparateur est toujours l'espace (ou plusieurs espaces), utilise la fonction split.

    http://perldoc.perl.org/functions/split.html
    \W correspond à un "mot":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    split(/\W/, 'hi there!', -1)
    Sinon, je ne pense pas qu'on puisse faire en une seule expression régulière, du coup ça devient plus long, il faut faire une boucle : une expression régulière/enlever le pattern trouvé avec substring

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Points : 116
    Points
    116
    Par défaut
    Voici mon bout de code qui parse la totalite du repertoire et applique la regexp sur toutes les lignes, il ne maque plus que le probleme du nombre de mot sur une ligne qui est inconnu et aleatoire...

    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
     
    opendir(REP,"$param_input") or print STDERR "  --> !Cannot open $param_input!\n" and usage() and die; ;
    while ($file = readdir(REP)) {
      if ($file ne "." && $file ne ".."){
        print STDERR "o open [$file] \n";
        open(FIC,"$param_input/$file") or print STDERR "  --> !Cannot open $file!\n" and usage() and die;
        while(<FIC>){
          if(/\s+(\w{4})\s+/){
            print "$file: [$1]\n" ;
          }
        }
        close(FIC) or print STDERR "  --> !Cannot close $file!\n" and usage() and die;
      }
    }
    closedir(REP);
    Merci d'avance

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Pour parser plusieurs fois le même motif, il suffit d'ajouter le modificateur g à la fin de la regexp.

    Exemple avec ton cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (my @words = /\b(\w{4})\b/g) {
      ...
    }

  7. #7
    Membre actif

    Profil pro
    Inscrit en
    Août 2009
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 156
    Points : 211
    Points
    211
    Par défaut
    L'exemple suivant récupère tous les matchs dans un tableau:
    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
    use strict;
    use warnings;
    use Data::Dumper;
     
    my $line = "aaaa bbbb cccccc dddd ee";
    my $line2 = "aaaa2 bbbb2 cccccc2";
     
    sub eprxTest {
    	my ($iline) = @_;
    	print "Traitement de :\"$iline\"\n";
    	my @result;
    	@result = ($iline =~ /(\w+\s*)/g);
    	print Dumper(@result);
    }
     
    eprxTest $line;
    eprxTest $line2;
    exit 0
    Par contre les espaces sont capturés dans le résultat aussi, donc il faudra les enlever ensuite, soit en refaisant une boucle sur ton tableaux, soit quand tu y accèdes si tu n'y accèdes qu'une fois.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Points : 116
    Points
    116
    Par défaut
    Merci pour vos réponses,

    Voici mon script final:
    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
     
    #********************************************
    #* Get parameters from command line
    #********************************************
    my $param_input  = shift or usage() and die; # path to input files folder
    $param_input =~ s/\//\\/g;                   # change / to \
    print STDERR "o LOG PATH = $param_input\n";
    #********************************************
    #* list script variable *********************
    #********************************************
    my $infile;                                  # input file which contains original content
    my $outfile;                                 # output file (contains data only)
    my @words_list;                              # list of data from infile
    my $size_list = 0;                           # size of list
    my $word;                                    # data
    #********************************************
    #* main process *****************************
    #********************************************
     
    # -- open source path and create into dest folder
    opendir(REP,"$param_input") or print STDERR "  --> !Cannot open FOLDER [$param_input]!\n" and usage() and die; ;
    mkdir("$param_input/Output") or print STDERR "  --> !Cannot create FOLDER [$param_input/Output]!\n" and die; ;
     
    # -- check all file in source path and aplly process
    # -- o process: open file
    #               check all lines and save all 16b words
    #               write all words into output file (same_name_as_input.out)
    #               move outfile into source_path/dest_folder
    # -- check all files in source path and process if not [.], [..] or [Output]
    while ($infile = readdir(REP)) {
      if ($infile ne "." && $infile ne ".." && $infile ne "Output")
      {
      	# open corresponding file
        open(FIC,"$param_input/$infile") and print STDERR "  o open [$infile] \n" or print STDERR "  --> !Cannot open INPUT [$infile]!\n" and die;
        # create output file with the same name (other extension)
        $outfile =$infile;
        $outfile =~ s/([a-zA-Z0-9_-]+).([a-zA-Z0-9_-]+)$/$1.out/;
        open(OUT, ">$outfile") and print STDERR "  o file [$outfile] created\n" or print STDERR "  --> !Cannot open OUTPUT [$outfile]!\n" and die;
        # check the content of input file
        while(<FIC>){
        	# regexp to save all 16b words
          if(@words_list=/\b([0-9A-Fa-f]{4})\b/gi)
          {
            $size_list = @words_list;      	
            print "    - $infile = [@words_list] : [$size_list]\n";
            # write all words in output file
            while($size_list>0){
            	$size_list--;
            	$word = shift(@words_list);
            	print OUT "$word\n";
            }   
          }
        }
        close(FIC) or print STDERR "  --> !Cannot close INPUT [$infile]!\n" and die;
        close(OUT) and print "    --> $outfile done\n" or print STDERR "  --> !Cannot close OUTPUT [$outfile]!\n" and die;
        # move output file to input_path/Output
        rename ("$outfile","$param_input/Output/$outfile"); 
      }
    }
    closedir(REP);
    Ce script fonctionne mais n'est peut etre pas optimisé et certains tips de perl ne sont peut etre pas appliqués.
    Tout commentaire est donc le bienvenue,

    Quelques petits trucs que je ne comprend pas:
    --> modifier les / en \ qui ne fonctionne pas
    --> n'y a t il pas une maniere plus directe pour creer mon outfile a partir du infile en changeant l'extension (genre
    $outfile= $infile =~ s/([a-zA-Z0-9_-]+).([a-zA-Z0-9_-]+)$/$1.out/ afin de le compacter ?

    Merci d'avance,

  9. #9
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par 50Nio Voir le message
    Par contre les espaces sont capturés dans le résultat aussi, donc il faudra les enlever ensuite, soit en refaisant une boucle sur ton tableaux, soit quand tu y accèdes si tu n'y accèdes qu'une fois.
    Regarde mon exemple juste au dessus du tien... il utilise "\b", une assertion de taille nulle

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Points : 116
    Points
    116
    Par défaut
    Concernant le changement de / en \ si quelqu'un a une idée,
    Si par la meme occasion il pouvait m'expliquer cela est du a quoi (j'utilise cygwin sous win2k).

    Merci !

  11. #11
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    1.
    Je travaille aussi sous cygwin, et je ne comprends pas pourquoi tu dois changer les chemins... tu n'utilises pas les path à partir de /cygdrive, en notation Unix ?
    C:\tmp devenant alors /cygdrive/c/tmp

    2.
    Remplace ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        $outfile =$infile;
        $outfile =~ s/([a-zA-Z0-9_-]+).([a-zA-Z0-9_-]+)$/$1.out/;
    par ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        use File::Basename;
        ...
        $outfile = fileparse($infile, qr/\..*/);

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Points : 116
    Points
    116
    Par défaut
    Bonjour,

    Je pensais modifier le path uniquement avec une regexp:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $param_input =~ s/\//\\/g;                   # change / to \
    Mais cela ne fonctionne pas...

    Il faut a chaque fois que l'utilisateur entre son path en argument dans le bon format.

    Y a t il une erreur dans la regexp ?

    Merci

  13. #13
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Je ne comprends pas pourquoi tes paths doivent être "traduits" à la mode Windows.
    Comment l'utilisateur fourni-t-il le PATH ? (un exemple)
    Et quelle fonction perl aurait besoin d'un path Windows pour s'exécuter sous Cygwin ???

    Néanmoins, as-tu essayé la regexp suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $param_input =~ s/\//\\\\/g;                   # change / to \\

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Points : 116
    Points
    116
    Par défaut
    Mon probleme vient du fait que le path récupéré en argument est complété par la suite:


    si le path est écrit avec des \ ce code ne fonctionne pas (la complétion est avec des /):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    my $param_type  = shift or die;
     
    open(FILE,"$param_type/../test/test.asm") or print "ERROR" and die;
    while(<FILE>)
      {
        print $_;
      }
      close (FILE);
    si tout le path est uniforme cela fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    my $param_type  = shift or die;
     
    open(FILE,"$param_type") or print "ERROR" and die;
    while(<FILE>)
      {
        print $_;
      }
      close (FILE);
    Faut il en fait uniformiser la syntaxe ?

  15. #15
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par sone47 Voir le message
    Faut il en fait uniformiser la syntaxe ?
    Ca me parait impératif...

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Points : 116
    Points
    116
    Par défaut
    Le probleme vient juste du fait que les \ sur le parametre d'entrée sont interprétés (ce qui est normal)...
    Il faut soit entrer des / soit des \\, soit trouver comment ne pas les interpreter dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $param_input = "$param_input"."/../test/test.asm";

Discussions similaires

  1. select multiple recupérer plusieurs valeurs
    Par Tanebisse dans le forum Langage
    Réponses: 11
    Dernier message: 15/12/2008, 14h56
  2. [AJAX] recupérer plusieur fichiers JSON
    Par Emcy dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 04/10/2007, 14h41
  3. [vb.net] OleDbDataReader recupérer plusieurs valeurs
    Par maniolo dans le forum Accès aux données
    Réponses: 1
    Dernier message: 02/10/2006, 17h14
  4. recupérer plusieurs ligne d'un fichier
    Par vince2005 dans le forum Langage
    Réponses: 6
    Dernier message: 27/07/2006, 10h50
  5. [JTable] Plusieurs JTable > plusieurs Model ?
    Par Zanton dans le forum Composants
    Réponses: 7
    Dernier message: 24/05/2006, 19h47

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