[Perl] Où $1 est-il capturé?
Jean
ponder.stibbons at orange.fr
Lun 4 Avr 07:28:49 CEST 2016
Le vendredi 01 avril 2016 à 12:04 +0200, Sebastien Moretti a écrit :
> Merci pour ces éclaircissements.
>
> Un risque dont je ne me méfiais pas (encore) sur du vieux code.
>
> >>> C'est pour cette raison qu'il faut vérifier que la regex a bien été
> >>> reconnue avant d'utiliser $1.
> >>
> >> Tu prêches un converti!
> >>
> >>> Exécute le code qui suit pour illustration. Le premier bloc est
> >>> incorrect car $1 conserve sa valeur tant qu'une nouvelle correspondance
> >>> n'est pas réussie (auquel cas $1 est mis à jour).
> >>
> >> Je pensais quand même qu'il y avait une limite, un scope, à ça.
> >> Mais non semble-t-il.
> >> Potentiellement très dangereux.
> >>
> > $1 est une variable *globale* et "use strict" accepte cette variable
> > globale (ainsi que toutes les variables spéciales comme $! ou $/).
> > Ce n'est pas la peine de chercher plus loin.
> >
Puisque je mets $1 sur le même plan que $/, je rappelle la façon très
connue de copier le contenu entier d'un fichier dans un scalaire
("slurp") sans perturber le reste du script et les modules :
my $contenu
open my $fh, '<', $nomfic
or die $!;
{
local $/ = undef;
$convenu = <$fh>;
}
close $fh or die $!;
Par analogie, je pense que l'on peut très bien écrire :
my $dir;
{
local $1 = undef;
$r_id =~ s/_(B|LR|RL)$//;
$dir = $1;
}
die "Invalid ID syntax: [$r_id]\n" unless $dir;
Attention, je n'ai pas testé.
Ce n'est pas très connu, car il y a d'autres possibilités
de faire (cf. la suite de mon message de vendredi), mais
cela peut être une solution intéressante, par exemple si
tu as besoin de $1 dans la partie substitution de ton
opérateur s///.
Ou alors, $1 est une variable en lecture seule, modifiable
uniquement pas m// et par s/// et je
viens de raconter des bêtises.
En espérant avoir été utile une nouvelle fois.
Jean
Plus d'informations sur la liste de diffusion Perl