Sujet : Re: Extraction nombre décimaux.
De : schaefer (at) *nospam* alphanet.ch (Marc SCHAEFER)
Groupes : fr.comp.lang.regexpDate : 24. Oct 2022, 08:53:27
Autres entêtes
Organisation : Posted through news.alphanet.ch
Message-ID : <tj5cp7$qg5$2@shakotay.alphanet.ch>
References : 1 2 3 4
User-Agent : tin/2.4.3-20181224 ("Glen Mhor") (UNIX) (Linux/4.19.0-22-amd64 (x86_64))
Olivier Miakinen <om+
news@miakinen.net> 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.orgavec 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 {}.