Natrafiłem na pewien problem w perlu dotyczący dopasowywania wzorców i zasięgu zmiennych. Oto przykładowy fragment kodu sprawiający problemy:
Kod: Zaznacz cały
use strict;
if ( "aaa128bbb321" =~ m/^([a-z]+)([0-9]+)([a-z]+)([0-9]+)/ ) {
jakas_funkcja($1); # $1 = aaa
}
sub jakas_funkcja {
my $var = shift;
print "\$var: \"$var\"\n";
$var =~ m/([a-z]+)([0-9]+)/;
if( $2 gt 10) {
print "To działa źle! Zmienna \$2: $2\n";
}
}
# Po wykonaniu takiego kodu dostajemy:
#
# [I]$var: "aaa"
# [/I][I]To działa źle! Zmienna $2: 128[/I]
W podręczniku systemowym jest napisane:
[quoteThe numbered match variables ($1, $2, $3, etc.) and the related punctuation set ($+, $&, "$`", "$'", and $^N) are all dynamically scoped until the end of the enclosing block or until the next successful match, whichever comes first.[/quote]
Wobec tego wszystko działa zgodnie z instrukcją. Obejście problemu:
Kod: Zaznacz cały
use strict;
my $temp;
{
if ( "aaa128bbb321" =~ m/^([a-z]+)([0-9]+)([a-z]+)([0-9]+)/ ) {
$temp = $1; # $1 = aaa
}
}
jakas_funkcja($temp) if( $temp );
sub jakas_funkcja {
my $var = shift;
print "\$var: \"$var\"\n";
$var =~ m/([a-z]+)([0-9]+)/;
if( $2 && $2 gt 10) {
print "To działa źle! Zmienna \$2: $2\n";
}
}
# Po wykonaniu takiego kodu dostajemy:
#
# [I]$var: "aaa"[/I]
Pozdrawiam