Deutsch   English   Français   Italiano  
<tj5cp7$qg5$2@shakotay.alphanet.ch>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!3.eu.feeder.erje.net!feeder.erje.net!news.alphanet.ch!alphanet.ch!.POSTED!not-for-mail
From: Marc SCHAEFER <schaefer@alphanet.ch>
Newsgroups: fr.comp.lang.regexp
Subject: Re: Extraction nombre =?ISO-8859-1?Q?d=E9cimaux=2E?=
Supersedes: <tj5co3$qg5$1@shakotay.alphanet.ch>
Date: Mon, 24 Oct 2022 06:53:27 -0000 (UTC)
Organization: Posted through news.alphanet.ch
Message-ID: <tj5cp7$qg5$2@shakotay.alphanet.ch>
References: <635501d4$0$22259$426a74cc@news.free.fr> <tj31nm$1nql$1@cabale.usenet-fr.net> <tj3esp$90q$2@shakotay.alphanet.ch> <tj41dt$1u68$1@cabale.usenet-fr.net>
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 <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.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 {}.