Kurt: Zusammenfassende Darstellung, Kritik willkommen!

Beitrag lesen

Hi

Auch "global" ist etwas missverständlich.

»»

In welchem Zusammenhang? Unter "global" verstehe ich "öffentlich", und lexikalische Variablen können im technischen Sinne nicht öffentlich sein, sondern nur privat.

Es ist "etwas" missverständlich für Leute die auf Spachen gelernt haben, die nur 2 Gliederungsebenen kennen, also "Hauptprogramm" und "Unterprogramm". Für die sind "globale" Variablen Hauptprogramsvariablen, die man in einer Subroutine benutzen kann ohne sie vorher als Parameter beim Aufruf übergeben zu haben.

Beliebig viele Gliederungsebenen mit privaten Variablen passt da aber schwer ins Konzept...

Hier mal ein Beispiel wie man die gleiche Aufgabe mit Packages und Closures (gekapselte private Variablen) löst.

Der entscheidende Unterschied ist, (neben der Eleganz) das man die Packagevariablen nicht sauber vor äußerem Zugriff schützen kann, weil öffentlich. Bei der Closurevariante kann ich AUSSCHLIESSLICH über die Routine init() auf die Variablen zugreifen.

Es hat schon seinen Grund warum die Deklarationen "my" und "our" heißen.

  
use strict;  
  
#------------------------------------------------------  
#        hier mit Closure privater Variablen  
#------------------------------------------------------  
  
  
{ my $max;  
  my $i=0;  
  
  sub init {  
   ($max)=@_;  
   $i=0;  
  }  
  sub step {  
   if (++$i > $max) { $i=0 };  
   return $i;  
  }  
}  
  
  
init(3);  
while (my $s=step()) {print $s;}            #: 1 2 3  
  
init(2);  
while (my $s=step()) {print $s;}            #: 1 2  
  
  
  
  
  
  
  
#------------------------------------------------------  
#  hier mit Package  
#------------------------------------------------------  
  
{ package cycle;  
  our $max; # Packagevariablen nur in diesem Scope deklarieren  
  our $i=0;  
  
  sub init {  
   ($max)=@_;  
   $i=0;  
  }  
  
  sub step {  
   if (++$i > $max) { $i=0 };  
   return $i;  
  }  
  
  sub export {  
   # exportiere step() init() von cycle:: nach main::  
   *main::step=\&step;  
   *main::init=\&init;  
  }  
}  
  
  
  
  
  
# zugriff auf Packageroutinen  
cycle::init(3);  
while (my $s=cycle::step()) {print $s;}               #: 1 2 3  
  
# kann die Variablen aber auch direkt  manipulieren, weil ffentlich  
$cycle::max=2;  
$cycle::i=0;  
while (my $s=cycle::step()) {print $s;}               #: 1 2  
  
# oder erst Packageroutinen importieren um Schreibarbeit zu sparen  
# zugriff auf Packageroutinen  
cycle::export;  
init(4);  
while (my $s=step()) {print $s;}                      #: 1 2 3 4  
  

Gruß
Kurt

0 80

Frage zu packages

Connie
  • perl
  1. 0
    Patrick Andrieu
    1. 0
      Connie
      1. 0
        Connie
        1. 0
          Patrick Andrieu
          1. 0
            Struppi
            1. 0
              Patrick Andrieu
              1. 0
                Struppi
                1. 0
                  Patrick Andrieu
            2. 0
              Connie
              1. 0
                Connie
    2. 0
      Connie
    3. 6

      Konzept der Namensräume; Global, Dynamic und Lexical Scope

      Siechfred
      1. 0
        Connie
      2. 0
        Connie
        1. 0
          Patrick Andrieu
          1. 0
            Connie
            1. 0
              Patrick Andrieu
              1. 0
                Connie
                1. 0
                  Connie
                  1. 0
                    Struppi
                    1. 0
                      Connie
                      1. 0
                        Struppi
                        1. 0
                          Connie
                          1. 0
                            Struppi
                            1. 0
                              Connie
                              1. 0
                                Struppi
                                1. 0
                                  Connie
                                  1. 0
                                    Struppi
                                    1. 0
                                      Connie
                                      1. 0
                                        Struppi
                                      2. 0
                                        Struppi
                                      3. 0
                                        Patrick Andrieu
                                        1. 0
                                          Struppi
                                          1. 0
                                            Kurt
                                            1. 0
                                              Struppi
                                              1. 0
                                                Kurt
                                                1. 0
                                                  Struppi
                                                  1. 0
                                                    Kurt
                                                    1. 0
                                                      Kurt
                                                      1. 0
                                                        Thomas
                                                        1. 0
                                                          Siechfred
                                                          1. 0
                                                            Kurt
                                                            1. 0
                                                              Siechfred
                                                              1. 0
                                                                Kurt
                                                        2. 0
                                                          Kurt
                                                          1. 0
                                                            Kurt
        2. 0
          Siechfred
      3. 0
        Patrick Andrieu
        1. 0
          Kurt
      4. 0
        Kurt
        1. 0

          my erzeugt keinen Packagevariablen!

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

              Konzeption...

              Patrick Andrieu
              • menschelei
            2. 0
              Kurt
              1. 0
                Siechfred
                1. 0
                  Kurt
  2. 0
    Kurt
    1. 0
      Kurt
    2. 0
      Struppi
      1. 0
        Kurt
      2. 0
        Interessierter Leser
        1. 0
          Interessierter Leser
          1. 0

            Coping with Scoping

            Kurt
        2. 0
          Kurt
  3. 0

    Zusammenfassende Darstellung, Kritik willkommen!

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

                  1 Klasse= 1 Modul ?

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