Olivier Miakinen <
om+...@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
avec
a.pl:
schaefer@reliand:/tmp$ ./
a.pl
bad: schaefer,
alphanet.ch, toto,
truc.org
good:
scha...@alphanet.ch,
to...@truc.org
avec:
use strict;
use warnings;
my $s = '
scha...@alphanet.ch to...@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 ('
scha...@alphanet.ch',
'
to...@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 {}.