RE: [Vienna-pm] Gültigkeitsbereich von Variablen

LAUN Wolfgang wolfgang.laun at alcatel.at
Mon Feb 23 02:37:52 CST 2004


On Mon, Feb 23, 2004 at 06:24:12AM +0100, Klaus Zahradnik wrote:
> #!/usr/bin/perl
> use warnings;
> use strict;
>                                                                                  
> my $x = 10;
> $_ = "alpha";
> {
>    my $x = 20;
>    local $_ = "beta";
>    somesub();
> }
> somesub();
>                                                                                 
> sub somesub() {
>    print "\$x is $x\n";
>    print "\$_ is $_\n";
> }
> 
> $x ist immer 10. Daraus folgern wir, das der Wert von $x aus dem Bereich
> genommen wird, in dem die Funktion definiert wird, richtig?
> Aber warum ist das so? Nach meinem Verständnis, müsste $x aus dem
> Bereich genommen werden in welchem die subroutine aufgerufen wird!?
> 

Gegen "nach meinem Verständnis" ist natürlich nichts zu sagen :-)

Andrerseits: Leute, die mit blockstrukturierten Sprache (a la Pascal,
C usw.) "aufgezogen" wurden, würden da kein Problem sehen. Die
Regel, dass die Sichtbarkeit durch die *statische* Schachtelung
von Blöcken (d.h. "{...}" mit und ohne "sub" davor) abhängt, hat den
nicht zu unterschätzenden Vorteil, dass die Wirkung einer Subroutine
durch Lesen der Definition und (nur) deren Umgebung voll verstanden
werden kann.

Der Einsatz von Parametern bietet genug Möglichkeiten, um dem Caller
einer Subroutine Einfluß auf deren konkreten Ablauf zu erlauben;
dabei wird das aber an der Schnittstelle sichtbar!

Codierrichtlinien sagen i.d.R., dass die mehrfache Verwendung
desselben Namens auf verschiedenen Schachtelungsebenen verboten
ist:
   ...{ my $x; ... { my $x; ... } ... }

Von der Verwendung von "local" ist übrigens auch abzuraten (bis
auf die ganz, ganz wenigen Fälle, wo... ;-)

mfg
Wolfgang Laun
Transport Solutions Division
Alcatel Austria AG
Phone +43 1 27722 5662
Fax   +43 1 27722 1173
 










More information about the Vienna-pm mailing list