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

Beitrag lesen

Hi

Wie ist dies zu erklären?

Was genau intern abläuft kann ich dir nicht sagen, aber innerhalb einer Routine dynamisch eine andere zu definieren ist komplexe "Metaprogrammierung".

Grob gesprochen: Beim zwoten durchlauf von test() wird $x mit my neu deklariert, ist also nicht mehr mit dem $x des ersten Durchlaufs identisch.(Speicherstelle).

Das sub untertest() wird aber von perl NICHT redefiniert und bleibt an dem $x des ersten Durchlaufs von test() gebunden.

Deswegen die Warnung:
Variable "$x" will not stay shared at /tmp/tst.pl line 10 (#1)

Will man aber unbedingt dynamisch neue subs erzeugen, die an privaten Variablen eines äußeren Scopes gebunden sind (sogenannte Closures), sollte man das _anonym_ tun, statt einen konkreten Namen (hier unterstest() zu geben.

  
use warnings;  
use strict;  
  
  
sub test  
{  
 my $x = shift;  
 print "\n";  
 return  sub {  
  print $x++," ";  
 }  
}  
  
my $sub_ref=test(0);  #Sub-Referenz auf neue Unterroutine erhalten  
$sub_ref->();  
$sub_ref->();  
$sub_ref->();  
# 0 1 2  
  
$sub_ref=test(10);    #Sub-Referenz auf neue Unterroutine erhalten  
$sub_ref->();  
&$sub_ref();  #            andere Schreibweise  
&$sub_ref;    #            andere Schreibweise  
# 10 11 12  
  
  
  
*unterstest=test(20); # sub_ref auf Namen legen  
unterstest();  
unterstest();  
unterstest();  
# 20 21 22  
  
  
{  
  no warnings;          # Warnungen wg redefinition abschalten  
  *unterstest=test(30); # erneut sub_ref auf Namen legen  
}  
unterstest();  
unterstest();  
unterstest();  
# 30 31 32  
  
  
*unterstest=test(40);   # erneut sub_ref auf Namen legen  
# Warnung:  
#     Subroutine unterstest redefined at /tmp/tst.pl line 45  
unterstest();  
unterstest();  
unterstest();  
# 40 41 42  
  

Alles klar?

Bye
 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