[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