Siechfred: Verschachtelte Subroutinen und Gültigkeitsbereich von Variablen

Beitrag lesen

Hell-O!

In meinem error_log steht sowas, wenn ich die Datei aufrufe
Variable $cgi will not stay shared at line 40
Variable $LINK will not stay shared at line 42
Variable $cgi will not stay shared at line 56

Da haben wir vermutlich dein Problem: "Scoped Variables in nested Subroutines". Kleines Beispiel:

sub foo {  
  my $var = shift;  
  
  sub bar {  
    return $var *10;  
  }  
  return bar();  
}  
  
print foo(1);  
print foo(2);

Das wirft dir statt 10 und 20 zwei mal 10 aus.

Zur Erklärung:

Die Sub "bar" wirkt als Closure innerhalb der sub "foo". Beide teilen sich die in der äußeren Sub deklarierte Variable $var, allerdings nur den Wert, den sie bei erstmaligem Aufruf der äußeren Funktion erhalten hat. Wenn du obiges Beispiel das erste Mal aufrufst, erhält $var den Wert 1, den sich foo und bar teilen. Beim zweiten Aufruf erhält $var den Wert 2, teilt diesen aber nicht mehr mit bar, dort ist $var nachwievor 1.

Nachlesen kannst du das in perldiag: Variable "%s" will not stay shared.

Der einfachste Lösungsansatz ist, auf Closures zu verzichten, wenn es keinen wirklich guten Grund dafür gibt. Wenn es denn doch sein soll, dann verwende eine anonyme Sub:

sub foo {  
  my $var = shift;  
  
  my $bar = sub {  
    return $var *10;  
  }  
  return &$bar();  
}  
  
print foo(1);  
print foo(2);

Siehe hierzu perlsub.

Siechfred

--
Ich bin strenggenommen auch nur interessierter Laie. (molily)
Siechfreds Tagebuch || Falle Aufteilungsbescheid || RT 221 Erfurt-Altstadt i.V.