Antw: [vienna.pm] die Welt ist so ungerecht :-(

Roland Bauer Roland.Bauer at mediaprint.at
Thu Apr 20 10:24:08 CDT 2000


* * * vienna-pm-list * * *


Hallo Michael

keine Panik, ist nur eine Kleinigkeit ...
(aber da steckt mehr dahinter)

Es ist gut, dass Du use strict verwendest.

Man kann sich dann ueber manche Sachen nicht
drueberschwindeln ;-)

{my $summe = 0;} bedeutet, dass $summe nur
innerhalb des umschliessenden Blockes gueltig ist.
(Hinweis: Das willst Du hier nicht wirklich.)

Also hier nur innerhalb der geschweiften Klammern.

Und wenn Du dann beim print-Statement wieder
$summe verwenden willst, ist das fuer Perl eine andere
Variable. Fuer den Programmierer verwirrend, weil beide 
gleich heissen.

Damit use strict zufrieden ist, muesstetst Du vor diese
"neue" Variable wieder "my" schreiben:

END() { my $summe; print "$summe\n"; }

Und nun ist offensichtlicher, dass die beiden "$summe"
nichts miteinander zu tun haben.

Folgerichtig wuerde Perl "\n" (Leerzeile)ausdrucken.

Was Du wirklich willst:
Die beiden $summe sind dieselbe Variable, du musst sie also
mit my in einem "Block" deklarieren, der beide Unterbloecke
umschliesst. ZB so:

#!/usr/bin/perl -wan
use strict;
my $summe; # <<<<<<<<<<<<<<<<<<<<<< HIER
BEGIN() { 
      $summe = 0;  # block
}
$summe += $F[2];
END() { 
    print "$summe\n";  # block
}

EINMAL mit my deklariert: use strict ist zufrieden.
ZWEIMAL verwendet.


Der "umschliessende Block" ist hier das ganze Script.


WEITERES BEISPIEL:

my $x = 5;
print $x; # druckt 5
{
    my $y = 7;
    print $y; # druckt 7

        {
           my $z = 8;
        }
     print $y; # druckt 7
}
print $x; # druckt 5

das scheint logisch, weil ja $x und $y und $z verschiedene
variablen sind.

und weil sie verschieden sind, steht vor jeder genau einmal "my".

aber das geht auch nur mit $x

my $x = 5;
print $x; # druckt 5
{
    my $x = 7;
    print $x; # druckt 7

         {
               my $x = 8;
          }
    print $x; # druckt 7
}
print $x; # druckt 5


jetzt ist die argumentation umgekehrt: weil dreimal
ein my verwendet wird, sind fuer perl das innere und das
aeussere $x verschiedene variablen und jede hat
einen anderen wert und merkt sich den.

was mit my deklariert wird, kann aus einem "block" nicht
hinauswirken.

das zu verstehen, ist ziemlich wichtig, denn sonst verzweifelst
du mit use strict.

und ohne use strict verzweifelt man sowieso :-)

einfach nachfragen,
wenn das nicht verstaendlich war. (das  ist
auch nicht so leicht zu erklaeren. vor allem via email)


schoene gruesse
roland

###
You are subscribed to vienna-pm-list as "Roland Bauer" <Roland.Bauer at mediaprint.at>
http://www.fff.at/fff/vienna.pm/



More information about the Vienna-pm mailing list