2009-06-27 4 views
5

Quelle est la portée de $1 à $9 dans Perl? Par exemple, dans ce code:

sub bla { 
    my $x = shift; 
    $x =~ s/(\d*)/$1 $1/; 
    return $x;  
} 

my $y; 

# some code that manipulates $y 

$y =~ /(\w*)\s+(\w*)/; 

my $z = &bla($2); 
my $w = $1; 

print "$1 $2\n"; 

Qu'est-ce qui $1 être? Sera-ce le premier \w* de $x ou le premier \d* du deuxième \w* dans $x?

Répondre

17

de perldoc perlre

Les variables match numérotées (1 $, 2 $, 3 $, etc.) et l'ensemble de ponctuation connexes ($ +, & $, `$, $ » et $^N) sont tous de portée dynamique jusqu'à la fin du bloc englobant ou jusqu'au prochain match réussi, selon la première éventualité. (Voir « » Instructions composées « » dans perlsyn.)

Cela signifie que la première fois que vous exécutez une expression régulière ou une substitution dans un champ une nouvelle copie isé local est créé. La valeur d'origine est restaurée (& agrave; la local) lorsque la portée se termine. Donc, $1 sera 10 jusqu'à ce que l'expression rationnelle soit exécutée, 20 après l'expression rationnelle, et 10 à nouveau lorsque la sous-routine est terminée. Mais je n'utilise pas de variables regex en dehors des substitutions. Je trouve beaucoup plus claire de dire des choses comme

#!/usr/bin/perl 

use strict; 
use warnings; 

sub bla { 
    my $x = shift; 
    $x =~ s/(\d*)/$1 $1/; 
    return $x;  
} 

my $y = "10 20"; 

my ($first, $second) = $y =~ /(\w*)\s+(\w*)/; 

my $z = &bla($second); 
my $w = $first; 

print "$first $second\n"; 

$first et $second ont de meilleurs noms qui décrivent leur contenu.

+0

Je ne comprends pas la documentation que vous avez citée. Peut-être que je ne suis pas clair sur les implications de "dynamiquement portée". Alors, quelle est la réponse à la question? –

+0

Voir http://perl.plover.com/FAQs/Namespaces.html –

+0

@Rob Kennedy J'ai clarifié ce que signifie la portée dynamique. Vous pouvez également consulter http://perldoc.perl.org/perlfaq7.html#What%27s-the-difference-between-dynamic-and-lexical- (static) -scoping% 3F - Between-local () -and-my()% 3F –

2

Les variables seront valides jusqu'à la prochaine écriture dans le flux d'exécution.

Mais vraiment, vous devriez utiliser quelque chose comme:

my ($match1, match2) = $var =~ /(\d+)\D(\d+)/; 

Ensuite, utilisez match1 $ et Match2 $ au lieu de 1 $ et 2 $, il est beaucoup moins ambigu.

4

En faisant quelques petites modifications à votre code exemple:

sub bla { 
    my $x = shift; 
    print "$1\n"; 
    $x =~ s/(\d+)/$1 $1/; 
    return $x; 
} 
my $y = "hello world9"; 

# some code that manipulates $y 

$y =~ /(\w*)\s+(\w*)/; 

my $z = &bla($2); 
my $w = $1; 

print "$1 $2\n$z\n"; 

nous obtenons le résultat suivant:

hello 
hello world9 
world9 9 

montrant que la $1 est limitée au dynamic scope (à savoir le $1 affecté dans bla cesse d'exister à la fin de cette fonction (mais le $1 affecté à partir de la regex $y est accessible sous bla jusqu'à ce qu'il soit écrasé))

+3

Plus important encore, je pense, il montre que 1 $ * en dehors * de bla n'est pas affecté par ce que arrive * à l'intérieur * de bla. –

Questions connexes