Kurt: Unklare Meldung

Beitrag lesen

Hi

Das wäre super, wenn es so etwas gäbe!

Gut vor drei Tagen hatte ich noch ein Konzept ich versuchs mal freischnauze. Erstmal für "use strict" und dann die Unterschiede zu "no strict"

======= use strict.
1. Bevor Perl den Code ausführt weist er allen Variablennamen eine Variablenspeicher zu, abhängig von der aktuell gültigen und explizit notwendigen Deklaration.

=== Geltungsbereich

2. Der Geltungsbereich einer Deklaration hängt vom "lexical scope" ab, d.h. er erstreckt sich sozusagen ab der Deklaration bis zur nächsten schließenden Klammer der gleichen Ebene.

3. Der größtmögliche (Default-)Block ist dabei das aktuelle File selbst, d.h. um jedes File stehen gewissermaßen unsichtbare Klammern. Auch gelten der Inhalt von subs und evals als Blöcke,(sind ja auch geklammert).

4. Die Deklaration gilt auch in eingeschachtelten Blöcken, es sei denn im inneren wird der gleiche Variablenname neu deklariert. Dann gilt die übergeordnete Deklaration nur bis zur neuen.

=== Variablentypen

5. Wurde ein Variablenname mit "my" deklariert handelt es sich um eine private Variable des aktuellen Blockes, genannt "lexical variable". Ausserhalb des "Lexical Scopes" kann auf die Variable nicht mehr zugegriffen werden.

6. Wurde sie mit "our" deklariert, handelt es sich um eine öffentliche Variable, genannt Packagevariable. Auf diese kann während des ganzen Programmablaufs zugegriffen werden, auch von externen Files.

=== Packagevariablen Details

7. Packagevariablen werden verschiedenen Namensräumen zugewiesen, der durch  Voranstellung von '::' vor dem Variablennamen explizit adressiert werden kann, z.B. $raum::name. Defaultmäßig gilt der Namensraum 'main'.

8. Der im Scope gültige Namensraum kann mit dem Befehl "package Namensraum' eingestellt werden. (Namensräume können also ebenfalls geschachtelt werden)

9. Mit der Vollform $raum::name kann ich immer noch auf andere Namensräume zugreifen, solche komplette Variablenbezeichnungen sind auch vollständige Deklarationen bei Erstbenutzung (kein our notwendig).

10. Mit our $variablenname deklariere ich eine Variable im aktuellen Namensraum, d.h. selbst wenn sich im scope von "our" der Namensraum durch "package" ändert, gehört der Variablenname immer noch zum Namensraum der letzten Deklaration.

=== Fortgeschrittenes

11. Packagevariablen werden in sogenannten Symboltabellen abgelegt die man mit sogenannten Typeglobs manipulieren kann. Jeder Namensraum hat dafür eine Art Hash als Ablageort.

12. Alle Funktionen gelten auch nur jeweiligen Namensraum und müssen falls notwendig mit raum::sub() aufgerufen werden.

13. Mit "local" bekommen Packagevariablen einen sogenannten "dynamischen scope". Das bedeutet nichts anderes als dass der Inhalt einer globalen Variablen bis zum ende des aktuellen scopes weggesichert und dann restauriert wird, d.h. lokal im scope kann ein anderer Wert in die Symboltabelle geschrieben werden. Dieser Scope ist "dynamisch" da während des Programmablaufs den *Inhalt* einer Packagevariablen manipuliert wird, während my und our "statisch" den *Ort* einer Variablen deklarieren. "Local" ist auch keine echte Deklaration, eine "globale" Packagevariable muss im Scope bereits deklariert sein!!! Die nutzvollen Anwendungsfälle von local sind beschränkt, weswegen man es sparsam einsetzen sollte.

siehe auch http://faq.perl.org/perlfaq7.html#What_s_the_differenc

========= no strict

14. Ohne "strict" fordert perl keine explizite Deklaration von Packagevariablen. M.a.W. alle Variablen die nicht explizit vorher mit "my" als privat deklariert wurden, sind ab erstem Auftreten automatisch als Packagevriable deklariert. Dabei gilt für eine Packagevariable immer der aktuelle Namensraum, (es sei denn man hat vorher den Variablennamen mittels our an ein package gebunden, siehe 10)

15. Bis Perl 5.6 gabs beim Übergang zu strict nur eine Möglichkeit Packagevariablen zu erlauben, nämlich mit
"use vars  ...".
Dieses sollte man nur noch bei notwendiger  Abwärtskompatibilität nutzen, da der Scope hier umständlich vom denjenigen des aktuellen packages abhängt, statt wie bei "our" verwirrungsfrei 100% analog zu "my" geregelt worden zu sein.

=============================

OK ist wieder mehr geworden als geplant aber ist dafür explizit und aufsteigend gewichtet.

Ein Anfänger braucht erstmal nur den Lexical Scope der Klammerungsebenen der Blöcke zu verstehen und my zu benutzen (bis Regel 5)

Und der Profi kann sich darauf verlassen, dass er unter "strict" beim Auftreten einer Variablen ohne expliziten Namensraum sich nur "rückwärts" nach "oben" hangeln muss bis er auf die letzte Deklaration trifft, die entweder "my" oder "our" lautet, um zu wissen ob die Variable  einem Scope oder einem Namensraum gehört.

Konnte ich dir weiterhelfen?

Gruß
  Kurt

0 54

Unklare Meldung

Thomas
  • perl
  1. 0
    Struppi
  2. 0
    Patrick Andrieu
    1. 0
      Thomas
      1. 0
        Horst
        1. 0
          Thomas
          1. 0
            Struppi
            1. 0
              Horst
        2. 0
          Manuel B.
      2. 0
        Patrick Andrieu
      3. 0
        Daniel Thoma
        1. 0
          Thomas
          1. 0
            Patrick Andrieu
            1. 0
              Thomas
              1. 0
                Struppi
                1. 0
                  Patrick Andrieu
                2. 0
                  Thomas
                  1. 0
                    Struppi
                3. 0
                  Thomas
        2. 0
          Thomas nochmal
          1. 0
            Daniel Thoma
  3. 0
    Thomas
    1. 0
      Struppi
      1. 0
        Thomas
        1. 0
          Struppi
          1. 0
            Thomas
            1. 0
              Struppi
              1. 0
                Thomas
                1. 0
                  Struppi
                2. 0
                  Daniel Thoma
            2. 0
              Siechfred
              1. 0
                Thomas
                1. 0
                  Siechfred
                2. 0
                  Struppi
                  1. 0
                    Thomas
                    1. 0
                      Struppi
                    2. 0
                      Siechfred
                      1. 0
                        Thomas
                        1. 0
                          Kurt
                          1. 0
                            Thomas
                            1. 0
                              Kurt
                              1. 0

                                Kurzversion

                                Kurt
                              2. 0
                                Thomas
                                1. 0
                                  Kurt
                                  1. 0
                                    Thomas
                                    1. 0
                                      Kurt
                                      1. 0
                                        Struppi
                                        1. 0
                                          Kurt
                                        2. 0
                                          Kurt
                                          1. 0
                                            Struppi
                                      2. 0

                                        Klare Funktionsdefinitionen in Perl

                                        Kurt
    2. 0
      Siechfred
      1. 0
        Thomas
        1. 0
          Siechfred