[Perl] Rappeler une sous chaine dans une expression rationelle

Rappeler une sous chaine dans une expression rationelle [Perl] - Perl - Programmation

Marsh Posté le 05-04-2004 à 17:57:40    

Salut,
Voici le bout de coede. On ouvre un fichier et on regarde chaque ligne pour voir si elle correspond au pattern suivant. Ensuite, on veut recuperer une partie de cette chaine dans une variable. Cette partie est entouree de parenthese. Mais la partie qu'on veut recuperer peut changer en fonction des desideratas de l'utilisateur. Comment alors faire comprendre a perl qu'il faut qu'il aille chercher par exemple dans le contexte en dessous la variable $2 ou $3 sachant que l'on a $col_num qui represente le nombre de la colonne a choper. En fait, j'ai pensé à un truc du style de ce que j'ai mis en dessous, ou alors "\$"."$col_num" mais ca marche pas. Une idée ?
 
++
joa
 
if ($_=~ /^([0-9]*\.[0-9]+)\t(-?[0-9]*\.[0-9]+\S?-?[0-9]?)\t(-?[0-9]*\.[0-9]+\S?-?.[0-9]?)\t(-?[0-9]*\.[0-9]+\S?-?[0-9]?)\t(-?[0-9]*\.[0-9]+\S?-?[0-9]?)\t?(-?[0-9]*\.[0-9]+\S?-?[0-9]?)?\t?(-?[0-9]*\.[0-9]+\S?-?[0-9]?)?/ ) {
   }
      push(@tempModesArray,$"$col_num" );

Reply

Marsh Posté le 05-04-2004 à 17:57:40   

Reply

Marsh Posté le 06-04-2004 à 03:55:16    

Déjà, écrit \d au lieu de [0-9] et ça sera plus clair. Ensuite pour ton problème (si j'ai bien compris ce que tu veux), il suffit de récupérer le résultat de ta regexp dans un tableau : if (@a = /ton_truc_imbitable/), puis à accéder $a[$col_num].

Reply

Marsh Posté le 06-04-2004 à 09:22:33    

c'est pas bo :o

Code :
  1. /^(\d*\.\d+)(\t(-?\d*\.\d+\S?-?\d?)){6}/


et tu y devrait y voir un peu plus clair ( si elle marche :p )

Reply

Marsh Posté le 06-04-2004 à 11:20:13    

Salut,
 
Merci pour vos reponses. Oui, c pas bo ce truc mais ca reste comphréensible car loin d'etre un perl wizard je suis plutot un perl newbie. Cependant une petite question : comment recuperer le resultat de l'expression rationelle dans un tableau ?
Il suffit d'affecter le resultat à un tableau ?
 
Merci,
Joa

Reply

Marsh Posté le 06-04-2004 à 11:36:34    

oui matafan ayant oublié 2/3 caractères je pense :o

Code :
  1. @array = ($_=~ /^([0-9]*\.[0-9]+)\t(-?[0-9]*\.[0-9]+\S?-?[0-9]?)\t(-?[0-9]*\.[0-9]+\S?-?.[0-9]?)\t(-?[0-9]*\.[0-9]+\S?-?[0-9]?)\t(-?[0-9]*\.[0-9]+\S?-?[0-9]?)\t?(-?[0-9]*\.[0-9]+\S?-?[0-9]?)?\t?(-?[0-9]*\.[0-9]+\S?-?[0-9]?)?/ ) ;

Reply

Marsh Posté le 06-04-2004 à 18:05:09    

Ouai pourkoi tu utilise pas \d comme le dit Anapajai?
 
mais ya une petite erreur dans son adaptation de ta regexp:

Code :
  1. /^(\d*\.\d+)(?:\t(-?\d*\.\d+\S?-?\d?)){4,6}/


 
et donc effectivement pour recuperer tout ca tu fait:

Code :
  1. my @array = /^(\d*\.\d+)(?:\t(-?\d*\.\d+\S?-?\d?)){4,6}/;
  2. push(@tempModesArray, $array[$col_num];


(ya pas besoin de rajouter "$_ =~", c'est implicite)
 
sinon pour ta regexp de depart, t'es certain qu'elle marche?
pasque les \S au milieu d'une expressionc 'est jamais tres bon signe


Message édité par pospos le 06-04-2004 à 18:05:24
Reply

Marsh Posté le 28-04-2004 à 08:02:44    

Il y a dans le topic "Outils pour bien programmer" un excellent outil pour tester ses expressions régulières (pour windows).


Message édité par el muchacho le 28-04-2004 à 08:03:21
Reply

Sujets relatifs:

Leave a Replay

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