@CB oder Perl-Profis: Gültigkeitsbereich von Variablen - 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 Sonntag, 18.August.2002, 16:40.
    @CB oder Perl-Profis: Gültigkeitsbereich von Variablen

      Ursprung dieses Problems war eine Liste, bei der die von mir eingefügten Elemente plötzlich weg waren.

      Folgendes einfaches Programm reproduziert dieses Problem (die Funktion inner_loop ist innerhalb der Funktion routine definiert):

      <perl>
      sub routine {
       local $v = 10;
       my $b = 10;
       out "<br>Def($v|$b): ".\$v.' | '.\$b.'<br>';
       sub inner_loop {
        $v += 5;
        $b += 5;
        out "\ \ \ Inner-Loop($v|$b): ".\$v.' | '.\$b.'<br>';
       }
       inner_loop;
       inner_loop;
      }
      routine;
      routine;
      routine;
      </perl>
      

      Beim ersten Durchlauf von routine ist alles ok.
      Ab dem 2. Durchlauf spielt die Variable $v in inner_loop verrückt.

      Nach austesten habe ich herausgefunden, daß ab dem 2. Durchlauf die Funktione inner_loop immer auf das $v des 1. Durchlaufs von routine zugreift.
      Eigentlich sollte doch nach dem Beenden von routine das "erste $v" nicht mehr existieren!

      Link zum Beispiel: http://www.baseportal.de/cgi-bin/baseportal.pl?htx=/direkt/problems/my/test_my

      Fragen:
      Kann mir jemand erklären, was da abläuft?
      Wie kann ich eine Variable innerhalb eines Blocks definieren, damit sie außerhalb nicht mehr gültig ist (local ist hier keine Lösung)?
      Sollte es sich hier um die "Persistent Private Variables" handeln (http://www.perldoc.com/perl5.6/pod/perlsub.html#Persistent-Private-Variables), kann ich diese Eigenschaft in baseportal abdrehen?

      Herzliche Grüße von Jurenda :-})


    Antworten

 Alle Einträge zum Thema: Zur Liste 
    Beitrag von Jurenda (305 Beiträge) am Sonntag, 18.August.2002, 16:40.
    @CB oder Perl-Profis: Gültigkeitsbereich von Variablen

      Ursprung dieses Problems war eine Liste, bei der die von mir eingefügten Elemente plötzlich weg waren.

      Folgendes einfaches Programm reproduziert dieses Problem (die Funktion inner_loop ist innerhalb der Funktion routine definiert):

      <perl>
      sub routine {
       local $v = 10;
       my $b = 10;
       out "<br>Def($v|$b): ".\$v.' | '.\$b.'<br>';
       sub inner_loop {
        $v += 5;
        $b += 5;
        out "\ \ \ Inner-Loop($v|$b): ".\$v.' | '.\$b.'<br>';
       }
       inner_loop;
       inner_loop;
      }
      routine;
      routine;
      routine;
      </perl>
      

      Beim ersten Durchlauf von routine ist alles ok.
      Ab dem 2. Durchlauf spielt die Variable $v in inner_loop verrückt.

      Nach austesten habe ich herausgefunden, daß ab dem 2. Durchlauf die Funktione inner_loop immer auf das $v des 1. Durchlaufs von routine zugreift.
      Eigentlich sollte doch nach dem Beenden von routine das "erste $v" nicht mehr existieren!

      Link zum Beispiel: http://www.baseportal.de/cgi-bin/baseportal.pl?htx=/direkt/problems/my/test_my

      Fragen:
      Kann mir jemand erklären, was da abläuft?
      Wie kann ich eine Variable innerhalb eines Blocks definieren, damit sie außerhalb nicht mehr gültig ist (local ist hier keine Lösung)?
      Sollte es sich hier um die "Persistent Private Variables" handeln (http://www.perldoc.com/perl5.6/pod/perlsub.html#Persistent-Private-Variables), kann ich diese Eigenschaft in baseportal abdrehen?

      Herzliche Grüße von Jurenda :-})

     Antworten

    Beitrag von Christoph Bergmann (8110 Beiträge) am Montag, 19.August.2002, 13:39.
    Re: @CB oder Perl-Profis: Gültigkeitsbereich von Variablen

      Mmh, mir ist, äh, nich so ganz klar was Du genau machen willst:

      Warum definierst Du "inner_loop" innerhalb von "routine"? Könnte mir vorstellen dass das zu den Quereffekten führt und weiterhin glaube ich kostet es unnötig Performance, weil "inner_loop" damit bei jedem Aufruf von "routine" neu geparsed und definiert wird, was aber nur einmal nötig wäre.

      Ich weiss wie geschrieben nich genau was Du erreichen willst, aber wenn es sowas is:


      Def(10|10): SCALAR(0x8b45488) | SCALAR(0x8b5d560)
      Inner-Loop(15|15): SCALAR(0x8b45488) | SCALAR(0x8b5d560)
      Inner-Loop(20|20): SCALAR(0x8b45488) | SCALAR(0x8b5d560)

      Def(10|10): SCALAR(0x8b5bee0) | SCALAR(0x8b45488)
      Inner-Loop(15|15): SCALAR(0x8b5bee0) | SCALAR(0x8b45488)
      Inner-Loop(20|20): SCALAR(0x8b5bee0) | SCALAR(0x8b45488)

      Def(10|10): SCALAR(0x8b5c308) | SCALAR(0x8b5bee0)
      Inner-Loop(15|15): SCALAR(0x8b5c308) | SCALAR(0x8b5bee0)
      Inner-Loop(20|20): SCALAR(0x8b5c308) | SCALAR(0x8b5bee0)

      dann bräuchtest Du dazu folgenden Code:

      <perl>
      sub inner_loop {
      $v += 5;
      $b += 5;
      out "\ \ \ Inner-Loop($v|$b): ".\$v.' | '.\$b.'<br>';
      }
      

      sub routine {
      local $v = 10;
      local $b = 10;
      out "<br>Def($v|$b): ".\$v.' | '.\$b.'<br>';
      

      inner_loop;
      inner_loop;

      }
      

      routine;
      routine;
      routine;

      </perl>
      

      ;-)

     Antworten

    Beitrag von Jurenda (305 Beiträge) am Montag, 19.August.2002, 18:13.
    Re: @CB oder andere Perl-Profis: Gültigkeitsbereich von Variablen

      Danke, danke, danke!

      Das war eher ein Problem von "art of programming".

      Gibt's in Perl so etwas wie 'private' oder 'lokale' Routinen? Ich denke da an Hilfsroutinen in einer Tools-Sammlung für die Bibliothek :-)

      Da man ja in Perl eine sub überall hinschreiben kann (Hypothese ;-) hab ich es halt so wie in PASCAL gemacht und eine Hilfsroutine (inner_loop) innerhalb einer anderen Routine geschrieben.

      Als outer_loop wollte ich das eigentlich nicht machen, denn da benötige ich local und muß dann auf mögliche Nebeneffekte rücksicht nehmen.

      Mittlerweile hab ichs auch selber hingekriegt:

      <perl>
      {
      my $v...
      sub inner_loop { ... }
      sub routine {
         $v=10;
         ...
         inner_loop;
         ...
      }
      </perl>
      

      Nun habe ich $v als my und es spielt in keinen der beiden Routinen verrückt.

      Irgendwie interessant, daß man Routinen (also subs's) in Perl nicht verschachteln sollte!

      Zum Anschauen für Interessierte hab ich noch ein Beispiel mit allen Variablen-Varianten zusammengestellt: http://www.baseportal.de/cgi-bin/baseportal.pl?htx=/direkt/problems/my/test_my2

      Im Moment kann ich mir zwar nicht ganz vorstellen, wie man bei rekursiven Prozeduren und bei OOP keine Probleme damit bekommen kann, aber vielleicht gibts da ja auch Lösungsansätze, die ich noch nicht kenne ;-) *ganz bestimmt* *sicher*

      Herzliche Grüße von Jurenda :-})

     Antworten

    Beitrag von Christoph Bergmann (8110 Beiträge) am Dienstag, 20.August.2002, 18:16.
    Re: @CB oder andere Perl-Profis: Gültigkeitsbereich von Variablen

      In Perl gibt es alles ;-) Aber prinzipiell ist es so (O-Ton Larry Wall), "dass man das Haus eines Fremden deshalb nicht betritt, weil man nicht eingeladen ist und nicht deshalb weil ein Gewehr an der Wand hängt". Soll heissen: Gib zu Deinen privaten oder lokalen Routinen einfach keine Doku raus... ,-)

      Mit OO oder rekursiven Zeugs (da sowieso nich) gibts an sich eh keine Probleme, das is eher ne Namespace-Geschichte, s. "package" -> http://perldoc.com ... Vielleicht denkst Du auch zu kompliziert - Schicksal des Genies ;-))

      Ja, was noch? Verschachtelte "sub"-Definitionen mögen Ihren Sinn haben, aber im obigen Beispiel bestimmt nicht ;-) Und die Funktionsweise von "local" is schon klar definiert, muss man halt nur wissen was da passiert ;-)

     Antworten


     
 Liste der Einträge von 44550 bis 44700:Einklappen Zur Eingabe 
Neueste Einträge << 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | Neuere Einträge < 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.10s by baseportal.de
Erstellen Sie Ihre eigene Web-Datenbank - kostenlos!