Perl - zasi

Potrzebujesz pomocy z C, C++, perl, python, itp.
siwuch86
Beginner
Posty: 143
Rejestracja: 06 lutego 2008, 11:21
Lokalizacja: Kraków

Perl - zasięg zmiennych specjalnych $1, $2...

Post autor: siwuch86 »

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:

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]
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:

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]
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
ODPOWIEDZ