Stefan Muenz: local und my

Liebe Leute

in einem Thread weiter unten wurden die Variablenauszeichner local und my unterschieden.

Mir hat auch schon mal jemand die Ohren vollgeblasen, das sei voellig falsch beschrieben in SELFHTML, und hat mir dann etwas erklaert, das ich nicht verstand.

In den Dokus und Buechern, die ich kenne, hab ich jedenfalls nicht klar rausbekommen koennen, worin eigentlich der Unterschied zwischen den beiden Schluesselwoertern besteht.

Waere fein, wenn das jemand hier genau weiss und mal klaeren kann...

viele Gruesse
  Stefan Muenz

  1. Hallo Stefan!

    Ich habe schnell nochmal in der Perl-Doku nachsehen muessen :)

    Ich habe die Anleitung so verstanden, dass  _local_ die Variable nicht deklariert, sondern nur einer bereits vorhandenen Variable einen Wert zuweist, der ausserhalb des Kontextes der lokalen Deklaration seine Gültigkeit verliert.

    nach dem Motto: leg mal schnell den Zettel weg und nimm diesen, nachher kannst Du wieder Deinen eigenen Zettel nehmen.

    Dagegen sind mit _my_ deklarierte Variablen nur in der gleichen Verschachtelungsebene sichtbar.

    nach dem Motto: Im Klassenzimmer geht ein Zettel herum, von dem ein ausserhalb stehender nicht einmal was merkt.

    Bin mal gespannt auf die weiteren Erklärungen.

    Gruß
    Thomas

    PS: habe den Thread leider nicht auf die Schnelle gefunden und aus SELFHTML kenne ich nur _local_

  2. Moin, moin

    das Prinzip von local und my ist von Thomas
    eigentlich genau richtig erklaert.
    Hinzuzufuegen waere, dass es nur noch 3 Faelle gibt in denen local statt my verwendet werden muss.

    1. um einer globalen Variable einen temporaeren Wert zu geben (z.B.: $_)

    2. anlegen eines lokalen Datei- oder Verzeichnishandle oder einer lokalen Funktion

    3. wenn man zeitweise nur ein Element eines Arrays oder Hashes veraendern will

    Viele Gruesse

    Bernhard

  3. Auch auf die gefahr hin hier zu wiederholen, mein Verständnis von local und my

    1. local macht Variablen für alle außerhalb des Blockes unsichtbar. Für Routinen. die innerhalb des Blockes aufgerufen werden, sind sie jedoch sicht- und erreichbar.

    2. my macht Variablen für _alle_ anderen Blöcke unsichtbar.

    PS.: my ist erst ab Perl 5 verfügbar

    Chiau Pit

    1. Hi!

      1. local macht Variablen für alle außerhalb des Blockes unsichtbar. Für Routinen. die innerhalb des Blockes aufgerufen werden, sind sie jedoch sicht- und erreichbar.
      2. my macht Variablen für _alle_ anderen Blöcke unsichtbar.

      Yepp, um das nochmal zu verdeutlichen, hier ein Code-Auszug aus Eike Grotes Perl Guide (die URL ist leider tot, vor ein paar Tagen ging sie noch):

      $gl = 1;
      $loc = 2;
      $my = 3;

      print "main: $gl = $gl   $loc = $loc   $my = $my\n";
      sub1();
      print "main: $gl = $gl   $loc = $loc   $my = $my\n";

      sub sub1 {
         local $loc = 7;
         my $my = 8;

      print "sub1: $gl = $gl   $loc = $loc   $my = $my\n";
         sub2();
      }

      sub sub2 {
         print "sub2: $gl = $gl   $loc = $loc   $my = $my\n";
      }

      Der Output:
      main: $gl = 1   $loc = 2   $my = 3
      sub1: $gl = 1   $loc = 7   $my = 8
      sub2: $gl = 1   $loc = 7   $my = 3
      main: $gl = 1   $loc = 2   $my = 3

      Allerdings weiss ich jetzt immer noch nicht, was bei local intern so ablaeuft. In perlsub steht irgendwas von Manipulation der Symboltabelle, verstanden habe ich das aber nicht. So kann ich mir also immer noch nicht erklaeren, warum man local nun braucht, um ein funktionslokales Filehandle anzulegen (local *FH) und my dafuer nicht nehmen kann. Vielleicht kann ja mal noch jemand ein ausfuehrliche Erklaerung beisteuern.

      Calocybe