Kurt Z: Iterartorvariable

Beitrag lesen

Hi

Es existiert nur ein einziger Weg, lexikalische Variablen zu deklarieren, nämlich via my (so lese ich jedenfalls perlsub). Tut man dies nicht, erhält man automatisch eine Packagevariable. Und in dieses Konzept passen die Iterationsvariablen nicht rein, sie sind weder lexikalisch (wenn ohne my deklariert) noch Packagevariablen ($main::x ist undef).

Tatsächlich richtet es sich nachd eräßeren deklaration, was sich aber nur innerhalb der Schleife auswirkt und außerhalb keinen messbaren Unterschied ausmacht:

http://perldoc.perl.org/perlsyn.html#Foreach-Loops

"If the variable is preceded with the keyword my, then it is lexically scoped, and is therefore visible only within the loop. Otherwise, the variable is implicitly local to the loop and regains its former value upon exiting the loop. If the variable was previously declared with my, it uses that variable instead of the global one, but it's still localized to the loop. This implicit localisation occurs only in a foreach loop."

konkret:

#~~~Perl

use strict;

print "Wer irrt sich ?\t";
our $x="Perl";
my $y="Perl";

for $x (qw(Siechfred)) {
 print $main::x."? "; #: Siechfred?
}

for $y (qw( Kurt)) {
 print $y."? ";       #: Kurt?
}

print uc("\n\n $x! Ja $y irrt sich!!!\n"); #: PERL! JA PERL IRRT SICH!!!

  
Also du hast recht dass die Iteratorvariable nicht implizit "my" ist, und ich hab recht das strict mich nicht dazu zwingt diese explizit zu deklarieren um diese Verwirrung zu vermeiden.  
  
INSBESONDERE ergibt sich ein deutlicher Unterschied wenn innerhalb der Schleife eine Subroutine aufgerufen wird die auf globale Variablen zugreift.  
  
#~~~Perl
  
  
use strict;  
  
print "Wer irrt sich ?\t";  
our $x="Perl";  
my $y="Perl";  
  
  
  
  
for $x (qw(Siechfred)) {  
 say();    #: ich sag: Siechfred Perl  
}  
  
  
  
for $y (qw( Kurt)) {  
 say();    #: ich sag: Perl Perl  
 closure();  
  
 sub closure {  
  print "\n closure: $y"; #: closure: Perl  
 }  
}  
  
  
print uc("\n\n $x! Ja $y irrt sich!!!\n"); #: PERL! JA PERL IRRT SICH!!!  
  
  
sub say {  
 print "\nich sag: $x $y\n";  
}  
  
  
#

FAZIT: Vorsicht mit Iteratorvariablen ...

Gruß
  kurt

0 72

String Zeilenweise durchlaufen

Perl Anfänger
  • perl
  1. 0
    Horst
    1. 0
      Perl Anfänger
      1. 0
        Struppi
        1. 0
          Perl Anfänger
          1. 1
            Patrick Andrieu
            1. 0
              Perl Anfänger
              1. 0

                Nachtrag

                Perl Anfänger
              2. 0
                Patrick Andrieu
                1. 0
                  Perl Anfänger
                  1. 0
                    Patrick Andrieu
                    1. 0
                      Perl Anfänger
                      1. 0
                        Patrick Andrieu
                        1. 1
                          Siechfred
                          1. 0
                            Patrick Andrieu
                          2. 0
                            Perl Anfänger
                            1. 0
                              Patrick Andrieu
                              1. 0
                                Patrick Andrieu
                                1. 0
                                  MudGuard
                    2. 0
                      Perl Anfänger
              3. 0
                Struppi
                1. 0
                  Patrick Andrieu
                  1. 0
                    MudGuard
                    1. 0
                      Patrick Andrieu
                      1. 0
                        MudGuard
                        1. 0
                          Patrick Andrieu
                          1. 0
                            MudGuard
                            1. 0
                              Patrick Andrieu
                2. 0
                  Perl Anfänger
                  1. 0
                    Struppi
                    1. 0
                      Perl Anfänger
                      1. 0
                        Patrick Andrieu
                        1. 0
                          Perl Anfänger
                          1. 0
                            Kurt Z
                            1. 0
                              Perl Anfänger
                              1. 0
                                Patrick Andrieu
                              2. 0
                                Kurt Z
                    2. 0
                      Patrick Andrieu
                      1. 0
                        Struppi
                        1. 0
                          Patrick Andrieu
                          1. 0
                            Perl Anfänger
                            1. 0
                              Patrick Andrieu
            2. 0
              Siechfred
              1. 0
                Patrick Andrieu
                1. 0
                  Siechfred
                  1. 0
                    Struppi
                    1. 0
                      Siechfred
                  2. 0
                    Patrick Andrieu
          2. 0

            so in der Art?

            Kurt Z
            1. 0
              Kurt Z
              1. 0
                Perl Anfänger
              2. 0
                Siechfred
                1. 0
                  Kurt Z
                  1. 0
                    Siechfred
                    1. 0
                      Kurt Z
                      1. 0
                        Siechfred
                        1. 0

                          Iterartorvariable

                          Kurt Z
                          1. 0
                            Siechfred
                            1. 0
                              Kurt Z
              3. 0
                Perl Anfänger
                1. 0
                  Kurt Z
                  1. 0
                    Perl Anfänger
                    1. 0
                      Kurt Z
                      1. 0
                        _Perl_ Anfänger ;-)
                        1. 0
                          Kurt Z
                          1. 0
                            Perl Anfänger
                            1. 0
                              Kurt Z
                              1. 0
                                Perl Anfänger
                                1. 0
                                  Siechfred
                                  1. 0
                                    Kurt Z
                                  2. 0
                                    Perl Anfänger
                                2. 0
                                  Kurt Z