[PERL] Subtition

Subtition [PERL] - Perl - Programmation

Marsh Posté le 22-11-2012 à 12:14:38    

Bonjour amis développeurs
 
Encore un chalenge !
Voila j'ai un fichier texte qui contient des séries de "x"  
j'utilise une fonction qui me permet de lire le fichier et qui doit remplacer cette série de "x" par des "_" (underscore)  
Donc je lis le fichier, je test quelle ligne contient plus de 2 "x" de suite, maintenant j'essaye de remplacer ce pattern par un nombre égale de "_".
C'est ici que je bloque. je n'arrive pas à remplacer "x" par autant de "_".  
Voici la fonction qui lit et qui test chaque ligne qui contient plus de 2 "x".  
sub read_file ($) {
   # This sub is used to read the file a store in an array  
 my $src_name=$_[0];
 open(INFILE,"<",$src_name) or  
    die("Unable to open input file $src_name" );
 while ( <INFILE> ) {
   
  if (m/x{2,}/) {
   # --->>> C'est ici mon problème.
   print $_ ;
  }
 }
}
 
Merci pour vos réponses.
Cordialement  
Damien  

Reply

Marsh Posté le 22-11-2012 à 12:14:38   

Reply

Marsh Posté le 22-11-2012 à 21:29:30    

Bonjour,
 
Insérer a la place de la ligne
# --->>> C'est ici mon problème.  
ceci
s/x(?=xx)/-/g;
s/xx/--/g;
et ça devrait rouler.
 
Note: dans le code, on peut aussi remplacer if (m/x{2,}/) par if (m/xx/)
 
J'ai fait un test bête:
axxxxbcxxxdxxex ->  a----bc---d--ex
 
A+,


Message édité par gilou le 23-11-2012 à 00:34:15

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 23-11-2012 à 10:04:25    

Bonjour Gilou
Merci pour ta réponse. Excellente comme toujours.  
Tu mérites que je te paye un coup un de ces quatre.
Je n'arrive pas à trouver l'explication de (?=xx). A quoi correspond ce "?" ?  
A bientôt.  

Reply

Marsh Posté le 23-11-2012 à 12:15:20    

:hello:  
 
/x(?=xx)/ en fait, ça cherche un x suivi de deux x a droite, mais ça n'inclus pas le xx à droite dans la zone considérée comme traitée par le pattern matching.
 
Avec s/x(xx)/-/;    axxxxb ->  a-xb
Avec s/x(?=xx)/-/; axxxxb ->  a-xxxb
 
Ensuite le /g applique la transformation récursivement (en recommençant donc juste après le x transformé en - à chaque fois) ce qui a pour effet de collapser un xx....xxxx en --....--xx
s/x(?=xx)/-/g;        axxxxb ->  a--xxb
 
et le s/xx/--/g final traite les xx finaux restant.
 
A+,


Message édité par gilou le 23-11-2012 à 12:15:36

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed