Re: @Profis - my und local - leichte Konfusion bei mir:-(( bei mir nich :-)) - baseportal Forum - Web-Anwendungen einfach, schnell, leistungsfähig!
baseportal
English - Deutsch "Es gibt keine dummen Fragen - jeder hat einmal angefangen"

 baseportal-ForumDie aktuellsten 10, 30, 50, 100 Einträge anzeigen.  

 
 Ausgewählter Eintrag: Zur Liste 
    Beitrag von Jurenda (305 Beiträge) am Samstag, 21.September.2002, 15:32.
    Re: @Profis - my und local - leichte Konfusion bei mir:-(( bei mir nich :-))

      *schitt* doch etwas lang geworden diese Antwort, sorry ;-)

      Ich werd' mal versuchen, auf den my-local-Teil Deiner Frage zu antworten.
      Zuerst mußt Du bedenken, daß der Perl-Interpreter nur dann etwas machen kann, wenn er die "Namen" kennt. Dazu legt er eine Symboltabelle an, in die er alle Namen einträgt. Wenn Du nun vor den jeweiligen Namen ein $@%&* stellst, wird daraus eine Scalarvariable, ein Array, ein Hash,...

      Wichtig ist auch noch, daß wegen der Funktionalität von local dieses local erst zur Laufzeit behandelt wird.

      Wenn Du nun local's verwendest, dann kommt der Interpreter das erste Mal (beim Anlagen der Symboltabelle) bei Deiner sub vorbei in der Du auf die local-Variable einer anderen sub zugreifst. Da weiß der Interpreter aber noch nicht, daß Du auf diese Variable local sein soll, womit er diese vorerst als globale "Variable" (richtigerweise als globalen Namen) anlegt. Erst wenn der Interpreter zur Laufzeit in diese sub springt weiß er, dass diese local ist.
      Hm, eigentlich weiß er das auch nicht, denn es wird beim Definieren der localen Variable einfach der "Wert" (dieser ist wahrscheinlich undef) dieser "Variablen" (da ist sie wahrscheinlich noch "nur" ein globaler Name) zwischengespeichert und bis zum Ende des aktuellen Blocks mit einem anderen Wert belegt.

      Ein Beispiel:

       <perl>
       
       ###### Punkt 1
       
       $__global = 555;
       
       ###### Punkt 2
       
       sub outLocal {
          out "$__local<br>"; ####### Punkt 8
       }
       
       sub test {
                                         ###### Punkt 4
          my $__my = 8; ########### Punkt 5
          local $__local = 999; ###### Punkt 6
                                         ###### Punkt 7
          outLocal;
                                         ###### Punkt 9
       }
       
       ###### Punkt 3
       
       test;
       
       ###### Punkt 10
       
      </perl>
      

      Wenn wir das nun durch den Interpreter schicken passiert folgendes:

      Bevor wir zum Punkt 1 kommen legt der Interpreter eine Symboltabelle an, in der die global bekannten Namen abgelegt sind.

      Und nun schaun wir uns an, was bei den einzelnen Punkten passiert:

      Anfang: die Symboltabelle wird erstellt
      Punkt 1: hier sind die NAMEN __global und __local bekannt
      Punkt 2: wir kennen den SCALAR $__global und den NAMEN __local
      Punkt 3: wie Punkt 2!
      Punkt 4: wir kennen den SCALAR $__global und die NAMEN __local und __my
                    __my gibt's nur INNERHALB des aktuellen BLOCKS, nämlich sub test { }
      Punkt 5: hier wird nun aus dem NAMEN __my der SCALAR $__my, der nur innerhalb von sub test { } existiert!
      Punkt 6: hier wird nun aus dem NAMEN __local der locale SCALAR $__local, wobei der ursprüngliche Wert von __local,
                    nämlich undef, zwischengespeichert wird, bis dieser BLOCK beendet wird.
      Punkt 7: nun gibt's die SCALARE $__global, $__local und $__my
      Punkt 8: hier gibts wieder nur die SCALARE $__global und $__local. ACHTUNG: hier gibts KEIN __my und KEIN $__my
                    $__local ist mit den Werten der aufrufenden Stelle (also 999) belegt
      Punkt 9: An dieser Stelle (Ende des BLOCKS sub test { } ) wird der SCALAR $__local zurückgesetzt und es wird wieder undef zugewiesen,
                    wodurch nur mehr der NAME __local übrigbleibt. $__my und __my werden vollständig eliminiert.
      Punkt 10: jetzt gibts nur mehr den SCALAR $__global und den NAMEN __local
      
      Ende: jetzt wird alles weggeräumt

      Uff, ich hoffe, daß ich da jetzt nicht zu viel Verwirrung gestiftet habe.

      Natürlich könntest Du in outLocal mittels my $__local die locale Variable $__local mit einer my-Variable überdecken. So lange Du innerhalb von outLocal bist hast Du dann diese my-Variable und nach dem Beenden von outLocal wird Deine local-Variable von vorhin wieder restauriert.
      Hier zum Beispiel: http://baseportal.de/baseportal/direkt/problems/_solved/my/local_global_Forum

      WICHTIG: Schau Dir den Quellcode an, denn da kann ich Sachen darstellen, die hier im Forum nicht gehen:
      Quellcode: http://baseportal.de/baseportal/main?show=/direkt/problems/_solved/my/local_global_Forum

      Vielleicht hilft Dir diese Erklärung:
      my ist innerhalb eines BLOCKS physikalisch vorhanden. my-Variablen betreffen nur örtlich begrenzt den Programmcode, sind also statisch.
      local ist logisch innerhalb des BLOCKS. So lange das Programm sich während der Verarbeitung (also zur Laufzeit) innerhalb dieses Blocks befindet (wenn es in andere Unterroutinen springt nimmt es die localen Variablen mit) existieren diese Variablen (!). Sie sind dynamisch.
      
      Damit der Interpreter richtig funktionieren kann, benötigt er jedoch die NAMEN der localen Variablen global verfügbar!
       
      Übrigens, wenn Du Referenzen auf "Speicherbereiche" benutzt, wirds insofern schwieriger, weil Perl eine eigene Verwaltung dieser "Speicherbereiche" hat und genau weiß, wann Du alle Zeiger auf einen Speicherbereich verworfen hast und erst dann diesen freigibt. Da gibts dann Möglichkeiten, die man fast nicht mehr versteht ;-)
      Und Unvorhersehbares! Kostprobe? Bitte: http://baseportal.de/cgi-bin/baseportal.pl?htx=/baseportal/forum&wcheck=1&Pos=6222

      Herzliche Grüße von Jurenda :-})


    Ihre Antwort:

    Name: EMail: EMail bei Antwort? WWW:
    Titel:
    Text:

    Neuer Eintrag


 Alle Einträge zum Thema: Zur Liste 
    Beitrag von hempelr (1976 Beiträge) am Freitag, 20.September.2002, 12:08.
    @Profis - my und local - leichte Konfusion bei mir:-((

      Hallo,
      zum ypsten male - aber ich habs noch nicht geschnallt - außerdem hat mich das Perl-Kochbuch vollends konfus gemacht:
      Hab folgenden Konstrukt:

         if ($use)
         {my $db_name = substr($use,2);
            if ($act eq "n")
            {put undef ,"$db_name";
             $a_actiontext = "Datensatz hizugefügt..."
            }elsif $act eq "c" ´&& $dsnr)
            {mod "Id==!$dsnr", "$db_name";
            $a_actiontext = "Datensatz geändert..."
            }elsif ($act eq "d" && $dsnr)
            {del "Id==!$dsnr", "$db_name";}
            $a_actiontext = "Datensatz gelöscht..."
            }
         ..anderes zeugs...
      Nun ist $db_name natürlich für die Aktionen nicht sichtbar, mit local-Initialisierung aber schon.
      Nur schreibt das Perl-Kochbuch, daß da $db_name nur neu belegt wird, aber trotzdem global definiert ist (oder hab ich das falsch begriffen - s. auch Perl-Kochbuch Rezept 10.13, S. 371)
      
      Wie mach ich es nun richtig?
      Danke für Tip
      Ruben

     Antworten

    Beitrag von Jurenda (305 Beiträge) am Samstag, 21.September.2002, 15:32.
    Re: @Profis - my und local - leichte Konfusion bei mir:-(( bei mir nich :-))

      *schitt* doch etwas lang geworden diese Antwort, sorry ;-)

      Ich werd' mal versuchen, auf den my-local-Teil Deiner Frage zu antworten.
      Zuerst mußt Du bedenken, daß der Perl-Interpreter nur dann etwas machen kann, wenn er die "Namen" kennt. Dazu legt er eine Symboltabelle an, in die er alle Namen einträgt. Wenn Du nun vor den jeweiligen Namen ein $@%&* stellst, wird daraus eine Scalarvariable, ein Array, ein Hash,...

      Wichtig ist auch noch, daß wegen der Funktionalität von local dieses local erst zur Laufzeit behandelt wird.

      Wenn Du nun local's verwendest, dann kommt der Interpreter das erste Mal (beim Anlagen der Symboltabelle) bei Deiner sub vorbei in der Du auf die local-Variable einer anderen sub zugreifst. Da weiß der Interpreter aber noch nicht, daß Du auf diese Variable local sein soll, womit er diese vorerst als globale "Variable" (richtigerweise als globalen Namen) anlegt. Erst wenn der Interpreter zur Laufzeit in diese sub springt weiß er, dass diese local ist.
      Hm, eigentlich weiß er das auch nicht, denn es wird beim Definieren der localen Variable einfach der "Wert" (dieser ist wahrscheinlich undef) dieser "Variablen" (da ist sie wahrscheinlich noch "nur" ein globaler Name) zwischengespeichert und bis zum Ende des aktuellen Blocks mit einem anderen Wert belegt.

      Ein Beispiel:

       <perl>
       
       ###### Punkt 1
       
       $__global = 555;
       
       ###### Punkt 2
       
       sub outLocal {
          out "$__local<br>"; ####### Punkt 8
       }
       
       sub test {
                                         ###### Punkt 4
          my $__my = 8; ########### Punkt 5
          local $__local = 999; ###### Punkt 6
                                         ###### Punkt 7
          outLocal;
                                         ###### Punkt 9
       }
       
       ###### Punkt 3
       
       test;
       
       ###### Punkt 10
       
      </perl>
      

      Wenn wir das nun durch den Interpreter schicken passiert folgendes:

      Bevor wir zum Punkt 1 kommen legt der Interpreter eine Symboltabelle an, in der die global bekannten Namen abgelegt sind.

      Und nun schaun wir uns an, was bei den einzelnen Punkten passiert:

      Anfang: die Symboltabelle wird erstellt
      Punkt 1: hier sind die NAMEN __global und __local bekannt
      Punkt 2: wir kennen den SCALAR $__global und den NAMEN __local
      Punkt 3: wie Punkt 2!
      Punkt 4: wir kennen den SCALAR $__global und die NAMEN __local und __my
                    __my gibt's nur INNERHALB des aktuellen BLOCKS, nämlich sub test { }
      Punkt 5: hier wird nun aus dem NAMEN __my der SCALAR $__my, der nur innerhalb von sub test { } existiert!
      Punkt 6: hier wird nun aus dem NAMEN __local der locale SCALAR $__local, wobei der ursprüngliche Wert von __local,
                    nämlich undef, zwischengespeichert wird, bis dieser BLOCK beendet wird.
      Punkt 7: nun gibt's die SCALARE $__global, $__local und $__my
      Punkt 8: hier gibts wieder nur die SCALARE $__global und $__local. ACHTUNG: hier gibts KEIN __my und KEIN $__my
                    $__local ist mit den Werten der aufrufenden Stelle (also 999) belegt
      Punkt 9: An dieser Stelle (Ende des BLOCKS sub test { } ) wird der SCALAR $__local zurückgesetzt und es wird wieder undef zugewiesen,
                    wodurch nur mehr der NAME __local übrigbleibt. $__my und __my werden vollständig eliminiert.
      Punkt 10: jetzt gibts nur mehr den SCALAR $__global und den NAMEN __local
      
      Ende: jetzt wird alles weggeräumt

      Uff, ich hoffe, daß ich da jetzt nicht zu viel Verwirrung gestiftet habe.

      Natürlich könntest Du in outLocal mittels my $__local die locale Variable $__local mit einer my-Variable überdecken. So lange Du innerhalb von outLocal bist hast Du dann diese my-Variable und nach dem Beenden von outLocal wird Deine local-Variable von vorhin wieder restauriert.
      Hier zum Beispiel: http://baseportal.de/baseportal/direkt/problems/_solved/my/local_global_Forum

      WICHTIG: Schau Dir den Quellcode an, denn da kann ich Sachen darstellen, die hier im Forum nicht gehen:
      Quellcode: http://baseportal.de/baseportal/main?show=/direkt/problems/_solved/my/local_global_Forum

      Vielleicht hilft Dir diese Erklärung:
      my ist innerhalb eines BLOCKS physikalisch vorhanden. my-Variablen betreffen nur örtlich begrenzt den Programmcode, sind also statisch.
      local ist logisch innerhalb des BLOCKS. So lange das Programm sich während der Verarbeitung (also zur Laufzeit) innerhalb dieses Blocks befindet (wenn es in andere Unterroutinen springt nimmt es die localen Variablen mit) existieren diese Variablen (!). Sie sind dynamisch.
      
      Damit der Interpreter richtig funktionieren kann, benötigt er jedoch die NAMEN der localen Variablen global verfügbar!
       
      Übrigens, wenn Du Referenzen auf "Speicherbereiche" benutzt, wirds insofern schwieriger, weil Perl eine eigene Verwaltung dieser "Speicherbereiche" hat und genau weiß, wann Du alle Zeiger auf einen Speicherbereich verworfen hast und erst dann diesen freigibt. Da gibts dann Möglichkeiten, die man fast nicht mehr versteht ;-)
      Und Unvorhersehbares! Kostprobe? Bitte: http://baseportal.de/cgi-bin/baseportal.pl?htx=/baseportal/forum&wcheck=1&Pos=6222

      Herzliche Grüße von Jurenda :-})

     Antworten

    Beitrag von hempelr (1976 Beiträge) am Samstag, 21.September.2002, 18:11.
    Re: @Profis - my und local - leichte Konfusion bei mir:-(( bei mir nich :-))

      hallo, jurenda
      hab erst mal dank für die umfangreiche Antwort.
      Ich hab sie erst mal gespeichert und werd mich mal drübermachen, es zu verstehen.
      Muß im Moment noch n Projekt endlich mal fertigkriegen, werd sonst von den "Mitstreitern" gesteinigt.
      Das eigentliche Problem umgeh ich erst mal durch "Trial-and Error" - nicht sehr effektiv aber es sind doch Ergebnisse erzielbar.
      Meld mich dann noch mal zu deinem Posting.
      CU
      Ruben

     Antworten

    Beitrag von hempelr (1976 Beiträge) am Samstag, 21.September.2002, 19:31.
    Re: Neue Frage - Variablen in foreach-Schleifen war:@Profis - my und local

      Gleich mal noch ne neue Frage dazu:
      Da ich Option-Felder dynamisch generieren lasse, läuft in ner Sub ne foreach-Schleife.
      Wie sind denn die Gültigkeitsbereiche dadrin? Wenn ich eine Var innerhalb der for-Schl. mittels my initialisiere, kennt der Rest der Sub sie nicht, wenn ich im sie im Sub-Kopf lexikalisch deklariere, kennt sie auch die for-Schleife - ich werd noch verrückt.

      Da durch das Generieren der komplexen dynamischen Ausgaben eh schon jede Menge Variablen und Referenzen vorhanden sind, will ich um jeden Preis soviel wie möglich Variablen mit nur lokalem Gültigkeitsbereich haben - aber irgendwie scheint das ja schwieriger als alles andere zu sein.......... :-((

      Für Tips und Hilfen immer dankbar
      Ruben

     Antworten

    Beitrag von Jurenda (305 Beiträge) am Samstag, 21.September.2002, 21:32.
    Re: Neue Frage - Variablen in foreach-Schleifen war:@Profis - my und local

      Na, vielleicht doch mein Posting verstehen ;;;-)

      Ok, ich geb zu, das das hier etwas zäh ist.

      Also my gilt immer nur innerhalb eines BLOCKS.
      Dabei ist ein BLOCK alles was zwischen { } steht (geschweiften Klammern).

       sub testlex {
         my $_1=1;
         foreach my $_2 (@_) {
           my $_3=0;
           #... tu was mit $_2 und $_3
         }
       }
      

      $_1 gilt innerhalb des gesamten Bereichs, also auch innerhalb von foreach
      $_2 gilt nur innerhalb von foreach, nur hats bei jedem Durchlauf des foreach einen anderen Wert.
      $_3 gilt nur innerhalb des foreach und wird bei jedem Durchlauf neu definiert und INITIALISIERT!
      

      $_2 ist im Anschluß an foreach () { } nicht mehr definiert!

      Solltest Du jedoch ein $_3 brauchen, daß Du innerhalb foreach benutzen kannst, aber nicht neu initialisert werden darf, dann würde ich folgendes vorschlagen:

       sub testlex {
         my $_1=1;
                                 # zusätzlicher BLOCK!
         {
           my $_3=0;
           foreach my $_2 (@_) {
             #... tu was mit $_2 und $_3
             }
         }
       }
      

      Nun ist $_3 in deiner sub testlex unbekannt, aber innerhalb des neuen Blocks wird sie nur EINMAL initialisert und während des foreach steht sie zur Verfügung.

      Ich hoffe, ich habe Dein Problem erraten :-)

      Herzliche Grüße von Jurenda :-})

     Antworten

    Beitrag von hempelr (1976 Beiträge) am Sonntag, 22.September.2002, 09:29.
    Re: Neue Frage - Variablen in foreach-Schleifen war:@Profis - my und local

      hallo, Jurenda
      genau so hilft mir deine Erläuterung - jetzt seh ich erst mal wieder etwas durch - vielen Dank.
      Hatte aus Verzweiflung und weil ich empirisch zu ähnlichen Ergebnissen gekommen war dann (den offensichtlich richtigen) Schritt zur Deklarierung aller lokal gewünschten Variablen in Subs im Subkopf gemacht. Dadurch hab ich genau das erreicht, was ich wollte, alle Schleifen in der Sub sehen diese, aber das "Hauptprogramm" interessieren sie nicht.
      Hast dir ja ne Menge Arbeit gemacht, den Sachverhalt zu Erläutern (dein Template mit dem Programmablauf) - vielen Dank! So kann man Zusammenhänge kennen- und nutzenlernen.
      Ist manchmal nicht ganz trivial, die komplizierte Sprache des Perl-Kochbuchs zu verstehen und gewisse Dinge dann (richtig) umzusetzen.
      Und bei komplexeren Anwendungen in bp wirds dann schon mal haarig - bei so ca. 2000 Zeilen Code hat man dann noch zusätzlich das Problem beim Debuggen und Einkreisen und Lokalisieren von Fehlern wenn man gewisse Dinge nicht richtig kennt und versteht.
      Denke, wir werden noch manchmal das Forum "sprengen" (oder machen wir das zukünftig lieber per eMail?) - ich glaub du triffst mit deinen Erfahrungen und Erläuterungen genau meinen "Warum-geht-das-so-will-verstehen-Nerv".

      Die Hilfen und Tips aller anderen Forumsteilnehmer sind natürlich genau so wichtig und wertvoll!!!!

      Komischerweise kann ich mit purer "Black-Box"-Nutzung nicht immer was anfangen, wenn ich nicht begriffen habe, was die Rädchen im Kasten machen, dann krieg ichs meist auch nicht hin......
      Viele Grüße aus dem Erzgebirge
      Ruben

     Antworten

    Beitrag von hempelr (1976 Beiträge) am Montag, 23.September.2002, 07:01.
    Re: Neue Frage - Variablen in foreach-Schleifen war:@Profis - my und local

      so - nur mal kurz
      habe es nun endlich begriffen - meine Scripte entsprechend angepaßt - und schwupps sind ein paar Probleme weniger vorhanden.
      Feine Sache mit den lexikalischen Variablen - gleiche Namen für gleiche Sachverhalte aber unterschiedlichen Inhalte je nach Funktion - so blickt man wenigstens auch nach 1200 Zeilen Code noch durch......

     Antworten


     
 Liste der ersten 150 Einträge:Einklappen Zur Eingabe 
 Zur Eingabe  > Ältere Einträge | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 >> Älteste Einträge


Zurück zur Homepage

© baseportal.de. Alle Rechte vorbehalten. Nutzungsbedingungen



powered in 0.06s by baseportal.de
Erstellen Sie Ihre eigene Web-Datenbank - kostenlos!