[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