Path: ...!3.eu.feeder.erje.net!feeder.erje.net!news.alphanet.ch!alphanet.ch!.POSTED!not-for-mail From: Marc SCHAEFER Newsgroups: fr.comp.lang.regexp Subject: Re: Extraction nombre =?ISO-8859-1?Q?d=E9cimaux=2E?= Supersedes: Date: Mon, 24 Oct 2022 06:53:27 -0000 (UTC) Organization: Posted through news.alphanet.ch Message-ID: References: <635501d4$0$22259$426a74cc@news.free.fr> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit Injection-Date: Mon, 24 Oct 2022 06:53:27 -0000 (UTC) Injection-Info: shakotay.alphanet.ch; posting-account="schaefer"; logging-data="27141"; mail-complaints-to="usenet@alphanet.ch"; posting-host="634ce6c9682d817d72f6177875e2bb4f.nnrp.alphanet.ch" User-Agent: tin/2.4.3-20181224 ("Glen Mhor") (UNIX) (Linux/4.19.0-22-amd64 (x86_64)) Cancel-Key: sha256:dZXYHgjuNPBUMYWnLVA410l3FHODBjMW70scnSHibN0= Cancel-Lock: sha256:IIIANmCggX6oDbodExY24qRveDmk98QO0fIybPadUP0= sha256:GdflywVkotJryHPt9tdh7RdufHT4l582DfCqdiQWcbk= Bytes: 3410 Lines: 71 Olivier Miakinen wrote: > Je ne sais pas trop comment ça fonctionne en perl, mais en pricipe > ça devrait plutôt créer un tableau du style : > ( ("4.5", "", "4", "5", ""), ("-1.2", "-", "1", "2", "") ) En Perl, on a ce qu'on appelle le contexte de liste, ce qui met à plat les tableaux. Ce qui permet en une opération de mettre toutes les occurences (/g) de parenthèses dans le même tableau. exemple: $ ./a.pl bad: schaefer, alphanet.ch, toto, truc.org good: schaefer@alphanet.ch, toto@truc.org avec a.pl: use strict; use warnings; my $s = 'schaefer@alphanet.ch toto@truc.org'; my @bad = $s =~ /([^\@\s]+)\@([^\s]+)/g; print "bad: ", join(', ', @bad), "\n"; my @good = $s =~ /([^\s]+)/g; #my @good = split /\s+/, $s; print "good: ", join(', ', @good), "\n"; > Du moins si l'item 0 pour chaque capture est la séquence complète qui > a été capturée par la regexp, et si les items 1, 2, 3 et 4 correspondent > à chaque paire de parenthèses capturantes. En Perl, ça correspond à $1, $2, $3, ... pour chacune des parenthèses. C'est tout. On peut bien sûr imbriquer une toute grande parenthèse qui sera alors $1. $0 en Perl est toujours le nom du programme tel qu'il a été appelé (équivalent en C de argv[0]) Si l'on n'aime pas ça, on peut aussi utiliser la variante suivante: my @tableau; # modifie $s $s =~ s/([^\@\s]+)\@([^\s]+)/process_it($1, $2)/ge; avec sub process_it { my ($user, $domain) = @_; push(@tableau, [ $user, $domain ]); } Dans ce cas on aura @tableau = ([ 'schaefer', 'alphanet.ch' ], [ 'toto', 'truc.org' ]) que l'on peut reconvertir en ('schaefer@alphanet.ch', 'toto@truc.org') avec: # usage de la variable par défaut $_, ici en tant que # référence sur un tableau @tableau = map { $_->[0] . '@' . $_->[1] } @tableau; ou encore remplacer process_it par un simple: sub process_it { my ($user, $domain) = @_; push(@tableau, $user . '@' . $domain); } PS: en Perl () c'est une liste/tableau; [] une référence sur une liste/tableau, symétriquement pour les hashes () et {}.