[Vienna-pm] G?ltigkeitsbereich von Variablen

Thomas Klausner domm at zsi.at
Mon Feb 23 03:48:26 CST 2004


Hi!

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() {
             ^^
das brauchst du nur, wenn du Prototypen erklaeren willst. Tust du aber
nicht, also nicht sehr sinnvoll. Ausserdem krieg ich (perl 5.8.0) eine
warning:
main::somesub() called too early to check prototype at ns.pl line 10.
d.h. wenn du prototypen verwenden willst, musst die die sub vor dem ersten
Aufruf definieren.
Das alles hat aber nix mit dem Problem zu tun...

>    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!?


das $x=20 wird durch das my auf den aktuellen Block begrenzt. Du rufst
somesub ohne irgenwelche Parameter auf. somesub ist jetzt wieder ein eigener
Block, der allerdings kein "Unterblock" von dem vorherigen Block ist
(vermutung: weil's eine routine ist). d.h. dort wird $main::x verwendet (als
was $x immer interpretiert wird)

Anders schaut's aus, wenn du's so machst:

my $x = 10;
$_ = "alpha";
{
   my $x = 20;
   local $_ = "beta";
   somesub($x);
}
somesub($x);

sub somesub {
   my $x=shift; 
   print "\$x is $x\n";
   print "\$_ is $_\n";
}

IMO zeigt das:
* Perl ist nicht PHP
* Globale Variablen sind (meistens) eine schlechte Idee & stiften nur
  Verwirrung


-- 
#!/usr/bin/perl                               http://domm.zsi.at
for(ref bless{},just'another'perl'hacker){s-:+-$"-g&&print$_.$/}



More information about the Vienna-pm mailing list