Perl - zasięg zmiennych specjalnych $1, $2...
: 05 października 2011, 14:15
Witam serdecznie.
Natrafiłem na pewien problem w perlu dotyczący dopasowywania wzorców i zasięgu zmiennych. Oto przykładowy fragment kodu sprawiający problemy:
Funkcjia jakas_funkcja ma ustawione zmienne $1, $2 ... co stanowi pewien problem.
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:
Zamknięcie całego "if" w blok działa ale jest to beznadziejnie obskurne i nieczytelne. Podałem tutaj bardzo prosty przykład, jednak w programie, który uskuteczniam wygląda to o wiele gorzej i jest jeszcze mniej czytelne, a rozrósł się już całkiem pokaźnie i bez przerwy natrafiam na ten problem. Ciekawy jestem czy nie ma prostszego sposobu i będę bardzo wdzięczny za wszelkie sugestie.
Pozdrawiam
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