*Markus: Referenz auf gekapselte Variable?

Hallo,

irgendwie scheint mein Perl schon ziemlich eingerostet zu sein. Ich würde gerne in einer Methode über die lokale Hilfsvariable die Attribute verändern, aber weiß irgendwie nicht mehr, wie ich dies zu dereferenzieren habe.
Hier ist die angewendete Klasse:

  
package Newsticker;  
sub new    {  
   my $classname = shift;  
   my $self = {  
               datum => "",  
               ueberschrift => "",  
               text => ""  
       };  
return bless $self, $classname;  
}  

...und hier die Methode, wobei $d eigentlich eine Referenz auf das Attribut "datum" sein soll, sprich, $d soll "datum" verändern können, aber wie schaffe ich das? (zB hilft $$d auch nichts)

  
sub checkDatum    {  
       my $self = shift;  
       my $d = $self->{datum};  
       $d =~ s/^\s+|\s+$//;  
       if ($d eq '')   {  
       $d = 'Das Datum fehlt!';  
       }  
}  

Markus.

--
http://www.apostrophitis.at
Maschiene währe Standart Gallerie vorraus Packete Objeckte tollerant
  1. Hallo,

    ...und hier die Methode, wobei $d eigentlich eine Referenz auf das Attribut "datum" sein soll, sprich, $d soll "datum" verändern können, aber wie schaffe ich das? (zB hilft $$d auch nichts)

    wozu die temporäre variable?

    sub checkDatum    {
           my $self = shift;
           #my $d = $self->{datum};

    [code lang=perl]
             $self->{datum} =~ s/^\s+|\s+$//;
             $self->{datum} = 'Das Datum fehlt!' if $self->{datum} eq '';

    
    > }  
    > [/code]  
    >   
    >   
    > Markus.  
    > 
    
    -- 
    Swiss Army Chainsaw  
      
    Terrorific!  
    Given a cow full of milk, should the milk un-cow itself, or should the cow milk itself?
    
    1. Hallo,

      $self->{datum} =~ s/^\s+|\s+$//;
               $self->{datum} = 'Das Datum fehlt!' if $self->{datum} eq '';

        
      Ich weiß, dass es so funktioniert, aber mir ging es eigentlich ums Verständnis und fand, dass die Lesbarkeit dadurch gesteigert würde (falls ich mal mehrere Anweisungen habe), also wie würde das Konstrukt aussehen?  
        
      Markus.  
      
      -- 
      <http://www.apostrophitis.at>  
        
      Maschiene währe Standart Gallerie vorraus Packete Objeckte tollerant  
        
      ![](http://signatur.pithax.net/gentoo.jpg)
      
      1. Hallo *Markus,

        Du kannst so etwas schreiben:
        my $b = $self->{eigenschaft};
        und dann mit $$b arbeiten.

        Refrenzen auf Variablen oder Felder sind aber ziemlich Fehlerträchtig und erhöhen die Verständlichkeit von Code meiner Meinung nach nicht.
        Wenn Du eine Hilfsvariable brauchst, weil der Gesammtausdruck zu lang ist, weise das Ergebnis einfach hinterher wieder zu:

        my $b = $self->{eigenschaft}
        #irgendwas mit $b tun
        $self->{eigenschaft} = $b;

        Das kostet Dich eine Zeile und Du hast nicht mehrere Namen für die selbe Variable rumschwirren.

        Grüße

        Daniel

        1. Hallo,

          Du kannst so etwas schreiben:
          my $b = $self->{eigenschaft};
          und dann mit $$b arbeiten.

          Danke, mein Fehler war, dass ich $$b = ..... schrieb.

          Refrenzen auf Variablen oder Felder sind aber ziemlich Fehlerträchtig und erhöhen die Verständlichkeit von Code meiner Meinung nach nicht.

          Ok, ich bin überzeugt.
          Eine Verständnisfrage zur Aussagenlogik noch.
          Ich habe in diesem Script folgenden Ausdruck:

            
          if ($nt->checkDatum() && $nt->checkUeberschrift() && $nt->checkText())   {  
          #tue was  
          }    else   {  
          $nt->printHead();  
          $nt->printForm();  
          $nt->printFooter();  
          }  
          
          

          Die oberen drei "Checker"-Methoden liefern alle TRUE zurück, wenn keine Fehler auftraten. Natürlich ließ ich probehalber alle Varianten durchlaufen und bemerkte, dass die letzteren zwei Methoden einfach ignoriert werden, egal, was die erste Methode zurückliefert (TRUE, oder FALSE). Lösche ich die erste Methode weg, funktioniert nur die zweite, und die dritte wird weiter ignoriert. Wieso ist das so?
          Dabei überprüfte ich auf eine fehlende Eingabe. Steht nichts im Formular, soll nach dem Abschicken ein Hinweis auf das fehlende Feld ins jeweilige Attribut geschrieben werden (so wie bei meinem ursprünglichen Problem). Die Zuweisung funktioniert jedenfalls, die Ausgabe auch. Benutze ich Werte, werden diese problemlos nach dem Submit ausgegeben. Es liegt also wirklich an dem o.g. Ausdruck.

          Markus.

          --
          http://www.apostrophitis.at
          Maschiene währe Standart Gallerie vorraus Packete Objeckte tollerant
          1. Offensichtlich ist der Fehler darin begründet, dass nach einem "return" die weiteren Anweisungen einfach ignoriert werden. Ich habe es jetzt so gehandhabt, dass ich ein "error"-Attribut in der Klasse definiert habe, und später in den Methoden bei der Eingabeüberprüfung abprüfe, ob error noch "0" ist, wodurch ich dementsprechend reagieren kann.
            Ob man das üblicherweise so macht weiß ich zwar nicht, aber zumindest funktioniert es jetzt.

            Markus.

            --
            http://www.apostrophitis.at
            Maschiene währe Standart Gallerie vorraus Packete Objeckte tollerant
      2. Tja,

        jetzt stand ich auch erstmal ein bisschen im Wald, weil diese aktion imho ziemlich sinnfrei ist (unnütze temp variable usw).

        aber hier :)

          
        #[..]  
               $$d =~ s/^\s+|\s+$//;  
        #[..]  
               $$d = 'Das Datum fehlt!';  
        #[..]  
        
        

        gruss

        --
        Swiss Army Chainsaw
        Terrorific!
        Given a cow full of milk, should the milk un-cow itself, or should the cow milk itself?