[Perl] Où $1 est-il capturé?

Damien Krotkine damien at krotkine.com
Lun 4 Avr 09:28:16 CEST 2016


perl -E 'local $1 = undef'
Modification of a read-only value attempted at -e line 1.

Le mieux c'est vraiment le test du succès de l'application de la regex.

Pour récupérer le contenu d'un fichier j'utilise souvent ce golf:

my $content = ((local(@ARGV,$/)="filename"),<>);


Jean wrote:
> 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
>
> _______________________________________________
> Perl mailing list
> Perl at mongueurs.net
> http://listes.mongueurs.net/mailman/listinfo/perl

-------------- section suivante --------------
Une pièce jointe HTML a été nettoyée...
URL: <http://listes.mongueurs.net/mailman/private/perl/attachments/20160404/f02f08b1/attachment-0001.html>


Plus d'informations sur la liste de diffusion Perl