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

Sebastien Moretti sebastien.moretti at unil.ch
Mer 30 Mar 09:44:07 CEST 2016


C'est effectivement mieux comme ça mais my $dir = $1; va disparaître 
avec $r_id =~ s/_(B|LR|RL)$//

Le plus troublant est que je ne soupçonnais une telle étendue et portée 
des parenthèses capturantes!

Voici une portion plus large du code, avec là où $1 semble être capturée.
$1 est propagée dans la méthode "unify".
Je ne pensais pas cela possible.



my $id  = '';
...
else{
     ( $id ) = $txt =~ /ID\t(\w+)/;
     ...
     $mtnt->unify( 'in', 'out' );
...


sub unify {
    ...
    foreach my $r_num ( keys %{$self->{mnet}{$mnet_num}{rc}} ){
       my $r_id = $self->{rc}{$r_num}{id};
       $r_id =~ s/_(B|LR|RL)$//;
       my $dir = $1;
       die "Invalid ID syntax: [$r_id]\n"  unless $dir;
       $buf{$r_id}{$dir} = $r_num;
    }

> Cela peut effectivement venir d'une capture antérieure.
>
> Essaye plutôt ceci:
>
>      foreach my $r_num ( keys %{$self->{mnet}{$mnet_num}{rc}} ){
>          my $r_id = $self->{rc}{$r_num}{id};
>          if ($r_id =~ s/_(B|LR|RL)$//) {
>              my $dir = $1;
>              $buf{$r_id}{$dir} = $r_num;
>          } else {
>              die "Invalid ID syntax: [$r_id]\n";
>          }
>      }
>
>
> 2016-03-29 14:15 GMT+02:00 Sébastien MORETTI <sebastien.moretti at unil.ch
> <mailto:sebastien.moretti at unil.ch>>:
>
>     Hello
>
>     je suis en train de tester le code Perl d'un autre gars et j'ai
>     quelques soucis avec $1 qui capture je ne sais trop quoi.
>
>          foreach my $r_num ( keys %{$self->{mnet}{$mnet_num}{rc}} ){
>              my $r_id = $self->{rc}{$r_num}{id};
>              $r_id =~ s/_(B|LR|RL)$//;
>              my $dir = $1;
>              die "Invalid ID syntax: [$r_id]\n"  unless $dir;
>              $buf{$r_id}{$dir} = $r_num;
>          }
>
>     Auparavant la substitution $r_id =~ s/_(B|LR|RL)$//; était utile car
>     $r_id se terminait par _(B|LR|RL).
>     Désormais ce n'est plus le cas.
>     Je m'attendais à ce que $dir soit undef mais $dir prend une valeur
>     qui vient de je ne sais où. Même comportement si j'enlève la ligne
>     de la substitution.
>
>     Avez-vous une idée d'où $1 tire sa valeur?
>     Est-ce possible que ce soit hors de la boucle?
>
>     Merci
>
>     Perl 5.18.2, Linux 2.6.32-504.el6.x86_64

--
Sébastien Moretti


Plus d'informations sur la liste de diffusion Perl