Thread Gültigkeit von Variablen... oder so etwas. (30 answers)
Opened by theresa at 2008-02-18 13:44

murphy
 2008-02-18 18:07
#106071 #106071
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Gast+2008-02-18 14:27:28--
pq+2008-02-18 13:22:46--
ich würde hier nicht local benutzen, sondern erstmal das ganze überdenken.
zwei verschachtelte subroutinen will man in den seltensten fällen,


ich möchte hinzufügen: zwei verschachtelte benannte Subs will man eigentlich NIE!
Das ist ein ziemlich krankes Closure wo die Variablenbindung absolut unintuitiv wird.
[...]


Wollen würde ich das eigentlich öfters – in jeder funktionalen Programmiersprache benutzt man verschachtelte Subroutinen alle Nase lang! In Perl würde ich es aber nicht tun weil hier meiner Meinung nach zwei fundamentale Designfehler in der Programmiersprache gemacht wurden: Zum einen sollte ein Ausbrechen nicht nur aus dem lexikalischen Namensraum sondern sogar aus dem dynamischen Namensraum, wie es bei benannten inneren Subroutinen passiert, eigentlich am besten überhaupt nicht möglich und wenn dann nicht das Standardverhalten sein. Und zum anderen fehlen die dringend nötigen Konstrukte my sub ... und local sub ... in der Sprache.

Um zum Beispiel im OP zurückzukommen, könnte man das Problem aber auch wie folgt lösen, ohne local zu bemühen:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
my $zaehler = 0;
bla();

sub bla{
    my $var = $zaehler++;

    my $inbla = sub {
        if($var<2){
            bla();
        }
    }

    print "$var". "\n";
    $inbla->();
}


Oder mit einem etwas ungewöhnlicheren Einsatz von local:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
my $zaehler = 0;
bla();

sub bla{
    my $var = $zaehler++;

    local *inbla = sub {
        if($var<2){
            bla();
        }
    }

    print "$var". "\n";
    inbla();
}


Edit: Oder man schreibt das ganze gleich in einer Programmiersprache die für solche Konstruktionen gedacht ist:
Code: (dl )
1
2
3
4
(let bla ((zaehler 0))
(display zaehler)
(if (< zaehler 2)
(bla (+ zaehler 1))))

;-)
When C++ is your hammer, every problem looks like your thumb.

View full thread Gültigkeit von Variablen... oder so etwas.