division de string[resolu]

division de string[resolu] - Perl - Programmation

Marsh Posté le 02-06-2006 à 16:59:47    

J'ai un problème de string lol, je m'explique:
 
j'ai ce genre de string: "US4241611(A)(Cat. A)"
 
je veut couper à partir de la parenthèse afin d'obtenir ceci: "US4241611"
 
j'ai essayer avec substr mais il me renvoi seulement "(A)(Cat. A)" d'ou mon drame
 
Merci pour vos idées


Message édité par Lanfeust42 le 05-06-2006 à 14:03:53
Reply

Marsh Posté le 02-06-2006 à 16:59:47   

Reply

Marsh Posté le 02-06-2006 à 19:27:42    

fais un split ou match avec une regex. mais substr doit très bien marché également.
 

Code :
  1. my $s = "US4241611(A)(Cat. A)";
  2. my $us = substr($s, 0, 9);


 
perldoc -f substr

Reply

Marsh Posté le 03-06-2006 à 13:07:26    

Salut,
 
Tu peux aussi utiliser une regex ou la fonction unpack
 
la regex

Code :
  1. perl -e '$u="US4241611(A)(Cat. A)";$us=$u=~/(.*?)(?=\()/;print $1'


 
la fonction unpack

Code :
  1. perl -e '$u="US4241611(A)(Cat. A)";print unpack("A9",$u),"\n"'


lami20j

Reply

Marsh Posté le 05-06-2006 à 09:02:08    

Merci pour ces aides mais:
 
TAZ: Je ne l'ai pas préciser mais les chiffre après US varie c'est à dire je peut en avoir 8 9 ou 10 ou plus donc ta solution ne marcherais pas. Merci quand même .
 
lami20j:je n'arrive pas à utiliser tes règles dois-je mettre mon code ainsi??:
 

Code :
  1. if($word =~ /\(/){                       
  2.        $word=~/(.*?)(?=\()/;
  3.        $us=$word=~/(.*?)(?=\()/;


 
autre chose je débute un peu en PERL quel est la signification de print $1?
 
Merci de ton aide


Message édité par Lanfeust42 le 05-06-2006 à 09:03:10
Reply

Marsh Posté le 05-06-2006 à 09:07:12    

j'ai trouver avec ta solution TAZ j'ai fait un index juste avant:
 

Code :
  1. if($word =~ /\(/){
  2.        my $compt=index ($word, "(" );
  3.        $us = substr($word, 0, $compt);


Merci beaucoup à tous

Reply

Marsh Posté le 05-06-2006 à 09:53:30    

Salut,
 
j'ai commenté dans le code. J'espère que c'est assez claire.

Code :
  1. #!/usr/bin/perl
  2. #
  3. use warnings;use strict;
  4. my $u ="US424161100000077700888(A)(Cat. A)";
  5. $u =~ /(.*?) # ici je capture n'importe quelle caractère le minumum possible
  6.              # dans la variable $1, je me fait pas des soucis si j'ai
  7.              # US ou combien des nombres, mais j'arrête la capture à la
  8.              # rencontre de la 1ère ( grâce à *?)
  9.              # Enleve ? pour voir ce que tu vas obtenir
  10.        (?=   # ici je commence un test avant pour voir si
  11.           \( # j'ai une ( , donc ça remplace ton if avec la fonction index
  12.        )     # fin de test avant
  13.       /x;    # le modificateur x me permet d'inserer des commentaires
  14.              # et des espaces dans la regex
  15. # la regex est : /(.*?)(?=\()/
  16. print "$1\n";


 
Voilà le code sans commentaires

Code :
  1. #!/usr/bin/perl
  2. #
  3. use warnings;use strict;
  4. my $u ="US424161100000077700888(A)(Cat. A)";
  5. $u =~ /(.*?)(?=\()/;
  6. print "$1\n";


lami20j


Message édité par lami20j le 05-06-2006 à 09:57:52
Reply

Marsh Posté le 05-06-2006 à 10:19:04    

Merci beaucoup pour ces explication, si j'ai bien compris  le $1 est une variable "système", par contre je crois qu'il manque un signe  :D dans ton code ou sinon j'ai rater un train:
 
à la ligne 7 du code sans commentaire:
 
$u =~ /(.*?)(?=()/;
 
ca serait pas:
 
$u =~ /(.*?)(?=\()/; comme tu la marquer dans le code commenter ligne 18??
 
 
En tout cas merci pour cette explication

Message cité 1 fois
Message édité par Lanfeust42 le 05-06-2006 à 10:20:14
Reply

Marsh Posté le 05-06-2006 à 10:25:07    

je ne comprends pas trop l'interet de faire une assertion dans la mesure ou  la même sans marche aussi bien :o

Code :
  1. $u =~ /(.*?)\(/;


>Lamfeust tu as raison, il manque un "\" mais le forum l'a surement mangé!
 

Reply

Marsh Posté le 05-06-2006 à 10:30:38    

eu je commence vraiment le PERL, une assertion c'est le test (?=\()   ???
 

Reply

Marsh Posté le 05-06-2006 à 10:37:19    

Re,
 

Lanfeust42 a écrit :

si j'ai bien compris  le $1 est une variable "système", par contre je crois qu'il manque un signe  :D dans ton code ou sinon j'ai rater un train:
 
à la ligne 7 du code sans commentaire:
 
$u =~ /(.*?)(?=()/;
 
ca serait pas:
 
$u =~ /(.*?)(?=\()/; comme tu la marquer dans le code commenter ligne 18??


$1 c'est une variable spéciale des expressions régulières.
 
Il y a encore ( @+, @-, $+, $^R, $&, $`, $' )
 
On utilise les paranthèses dans une regex pour plusieurs raisons: regroupement, capture.
 
Donc pour capturer une sous-chaîne on mets des paranthèses autour du motif.  
Les paranthèses (ouvrantes) sont comptées en commencant de la gauche.
 
(\d)([a-z])(variable)
 
dans cet exemple  
$1 va conteniur un chiffre
$2 une lettre minuscule
$3 la sous-chaine variable
 
Oui il y a une erreur puisque j'ai modifié le message donc \ à été effacé.
C'est bien /(.*?)(?=\()/
 
Une paranthèse ouvrante ( est un métacaractère donc pour l'avoir en tant que caractère on doit l'echapée avec \ donc \(
 
lami20j

Reply

Marsh Posté le 05-06-2006 à 10:37:19   

Reply

Marsh Posté le 05-06-2006 à 10:44:14    

Salut,

anapajari a écrit :

je ne comprends pas trop l'interet de faire une assertion dans la mesure ou  la même sans marche aussi bien :o
/(.*?)\(/;


 
Tu as raison, ça marche aussi. Et pour cet exemple banal c'est vrai qu'on n'a pas vraiment besoin de (?=\().
Mais pourquoi? Parce une assertion de largeur nulle ne consomme pas de texte, et dans le cas d'un gros fichier ça peut servir.
 
lami20j

Reply

Sujets relatifs:

Leave a Replay

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