Charles: Geltungsbereich von my

Ich bin gerade etwas ratlos und finde auch im Netz und im SELFHTML-Archiv oder Forum nach langer Suche keine klare Auskunft, sondern nur recht ungenau Hinweise, was den Geltungsbereich von "my" anbetrifft.

Angenommen ich habe eine subroutine, und in dieser noch eine while- oder for-Schleife. Wenn ich nun innerhalb der while-Schleife in der sub die Erklärung mache:
sub xyz {
 while my ($i > 0) {
   $i++;
   usw.....
 }
}
gilt dann die Erklärung für $i nur in der Schleife oder in der ganzen subroutine?

Und was sind denn Geltungsräume für my-Deklarationen, Subs, Schleifen, eventuell auch if-Anweisungen?
Für Tipps (auch Hinweise auf Websites mit Erläuterungen) wäre ich sehr dankbar.
Charles

  1. hallo,

    Ich bin gerade etwas ratlos und finde auch im Netz und im SELFHTML-Archiv oder Forum nach langer Suche keine klare Auskunft

    Die gibt es zwar in SELFHTML selbst, allerdings an etwas versteckter Stelle.

    Angenommen ich habe eine subroutine, und in dieser noch eine while- oder for-Schleife. Wenn ich nun innerhalb der while-Schleife in der sub die Erklärung mache:
    sub xyz {
    while my ($i > 0) {
       $i++;
       usw...

    ... so solltest du eine Fehlermeldung bekommen.

    Und was sind denn Geltungsräume für my-Deklarationen, Subs, Schleifen, eventuell auch if-Anweisungen?

    Ups. Da geht einiges durcheinander. Zunächst einmal: mit "my" mußt du nur dann Variablen deklarieren, wenn du auch "use strict;" einsetzt. Das ist allerdings dringend geboten, genauso wie "use CGI::Carp qw(fatalsToBrowser);". Eine derart deklarierte Variable hat einen bestimmten Geltungsbereich. Du möchtest eventuell in einer Subroutine eine bestimmte Variable verwenden, die außerhalb dieser Subroutine nicht mehr gelten soll; genau dafür ist "my" gut.

    while my ($i > 0) {

    ist eine sehr zweifelhafte Angabe. Du könntest aber
       while (my $i > 0) {
    schreiben. Oder besser noch:
       sub xyz {
        my $i;
        while ($i > 0) {

    Das Ganze ist etwas komplizierter (und ließe sich mit "use vars qw()" teilweise außer kraft setzen), aber für den Anfang mag dir das vielleicht erstmal weiterhelfen. Vermutlich ist das, was dir "perldoc strict" auf deiner Konsole liefert, für dich eher verweirrend als erhellend, obwohl es alles das aussagt, was du wissen möchtest.

    Grüße aus Berlin

    Christoph S.

    --
    Visitenkarte
    ss:| zu:) ls:& fo:) va:) sh:| rl:|
  2. Hej,

    Angenommen ich habe eine subroutine, und in dieser noch eine while- oder for-Schleife. Wenn ich nun innerhalb der while-Schleife in der sub die Erklärung mache:

    sub xyz {
    while my ($i > 0) {
       $i++;
       usw.....
    }
    }

    Das ist ganz schlecht aus zwei Gründen:

    1.) Ist es syntaktisch falsch! Es müsste doch eher:

      
    sub xyz {  
      while ( my $i > 0) {  
         $i++;  
         usw.....  
      }  
    }
    

    heissen.

    2.) ist das aus einem konkreten Grund problematisch: Damit deklarierst du $i bei der Prüfung des boolschen Ausdruckes jedesmal neu. Anders als z.B. bei einer for-Schleife, wo die Deklaration in der Initialisierung nur einemal vorgenommen wird:

      
    for( my $i = 0; $i < 10; $i++ ) {  
      print( $i );  
    }
    

    Und was sind denn Geltungsräume für my-Deklarationen, Subs, Schleifen, eventuell auch if-Anweisungen?

    Mit my deklararierte Variablen gelten immer in dem Block, in dem sie deklarariert worden sind:

    http://perldoc.perl.org/functions/my.html

    Beste Grüße
    Biesterfeld

    --
    Art.1: Et es wie et es
    Art.2: Et kütt wie et kütt
    Art.3: Et hätt noch immer jot jejange
    Das Kölsche Grundgesetz
    1. 2.) ist das aus einem konkreten Grund problematisch: Damit deklarierst du $i bei der Prüfung des boolschen Ausdruckes jedesmal neu. Anders als z.B. bei einer for-Schleife, wo die Deklaration in der Initialisierung nur einemal vorgenommen wird:

      for( my $i = 0; $i < 10; $i++ ) {
        print( $i );
      }

        
      oder etwas Perliger  
      ~~~perl
        
      for my $i (0..10) {  
         print $i ;  
      }
      

      Struppi.

      --
      Javascript ist toll (Perl auch!)
      1. Hej,

        oder etwas Perliger

        for my $i (0..10) {
           print $i ;
        }

          
        Deswegen heisst es wahrscheinlich auch Perl. Solcher Code wird erst erträglich wenn die dritte Gerstenkaltschale im Rachen perlt :)  
          
        \*SCNR\*  
        Biesterfeld
        
        -- 
        Art.1: Et es wie et es  
        Art.2: Et kütt wie et kütt  
        Art.3: Et hätt noch immer jot jejange  
        [Das Kölsche Grundgesetz](http://isamhaddad.de/stuff/kgg.pdf)
        
  3. Hey,
    Coping with Scoping http://perl.plover.com/FAQs/Namespaces.html erklärt noch sehr viele interessante Dinge im Zusammenhang mit my.

    --
    水-金-地-火-木-土-天-海-冥