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

KurtZ
 2008-02-18 18:54
#106077 #106077
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
Hi Murphy

doch das geht schon in Perl lexikalisch basteln, ganz ohne local.
Die übliche Methode ist dabei anonyme Subs auf Sub_refs zu legen..

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
sub closure {
  my $abc = shift;   
  $rs_increment = sub {$abc++};    
  $rs_abc       = sub {$abc}  ;    
  print "Innen: ", &$rs_abc , "\n"; 
  ($rs_increment, $rs_abc);
}


($inc, $fetch) = closure(10);      #> Innen: 10
($inc2, $fetch2) = closure(20);  #> Innen: 20

&$inc;
&$inc;
&$inc;

print "Aussen: ",&$fetch;           #> Aussen: 13
print "Aussen: ",&$fetch2;         #> Aussen: 20


Problematisch wirds bei benannten Subs, weil sie wie du bereits sagtest
1. im aktuellen globalen Namensraum liegen.
2. was schlimmer ist, die Variablenbindung ist konfus, konkret würde statt
Code (perl): (dl )
1
2
$rs_abc= sub {}
sub abc {} 

in closure() stehen, würde immer auf die Closurevariablen des Ersten durchlaufs zugegriffen.


Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
sub closure {
  my $abc = shift;   
  $rs_increment = sub {$abc++};    
  sub abc {$abc}  ;    
  print "Innen: ", abc() , "\n"; 
  ($rs_increment, \&abc );
}


($inc, $fetch) = closure(10);                  #> Innen: 10
($inc2, $fetch2) = closure(20);              #> Innen: 10

&$inc;
&$inc;
&$inc;

print "Aussen: ",&$fetch;                      #>  Aussen: 13
print "Aussen: ",&$fetch2;                    #>  Aussen: 13


Für den OP ist das alles eh belanglos, er muss eine einfache rekursive Funktion mit Abbruchbedingung hinschreiben.


BTW: Du beherrschst die Sprache der wilden Klammerwälder und umgedrehten Notationen? ... Kannst mir mit meinem Emacs helfen? ;-)

EDIT: @Murphy: Sorry ich seh gerade die sub_ref schreibweise hast du ja auch schon beschrieben. Lesen müsste man können 8-)
( ich finde ich diese alternierenden Aufrufe von bla() und inbla() recht kryptisch - Was soll das?)
TMTOWTDYOG (there's more than one way to dig your own grave)

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