Perl Anfänger: Eigenschaft setzen - komisches Verhalten

Hi

ich habe 2 Methoden

use strict  
sub new {  
  my $self = shift;  
  return bless {  
    eigenschaft => 1,  
  }, ref $self || $self;  
}  
sub methode1(){  
  $self->{eigenschaft} = 2;  
  print $self->{eigenschaft}; # liefert 2  
  print &methode2($self); # liefert hin+wieder 1  
  print $self->{eigenschaft}; # liefert 2  
  
sub methode2(){  
  return $self->{eigenschaft};  
}

warum liefert die Methode2 hin+wieder den alten Wert der Eigenschaft?

ich kann mir dieses Verhalten nicht wirklich erklären

Danke

  1. Hallo Perl Anfänger!

    use strict

    .............^
    Semikolon?

    Aber ich glaube nicht, dass Du diesen Code unter »strict« getestet hast...:

    Global symbol "$self" requires explicit package name at - line 9.
    Global symbol "$self" requires explicit package name at - line 10.
    Global symbol "$self" requires explicit package name at - line 11.
    Global symbol "$self" requires explicit package name at - line 12.
    Global symbol "$self" requires explicit package name at - line 15.
    Missing right curly or square bracket at - line 16, at end of line
    syntax error at - line 16, at EOF
    Execution of - aborted due to compilation errors.

    Zeile 16: Bei sub methode1 fehlt am Ende eine Klammer »}«.

    Viele Grüße aus Frankfurt/Main,
    Patrick

    --

    _ - jenseits vom delirium - _
    [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
    Nichts ist unmöglich? Doch!
    Heute schon gegökt?
    1. Hi

      sorry - ich hab wohl das Beispiel zu sehr gekürzt ;-)

      use strict;  
        
      sub new {  
        my $self = shift;  
        return bless {  
          eigenschaft => '',  
          fill => 'abcdef0123456789',  
        }, ref $self || $self;  
      }  
      sub methode1(){  
        my $self=shift;  
        srand(time);  
        while(length($self->{eigenschaft}) < 50) {  
          $self->{eigenschaft} .= substr($self->{fill}, int(rand(length($self->{fill}))), 1);  
        }  
        print $self->{eigenschaft}."\n"; # liefert das richtige Ergebnis  
        print &methode2($self)."\n"; # liefert hin+wieder das falsche Ergebnis  
        print $self->{eigenschaft}."\n"; # liefert das richtige Ergebnis  
      }  
      sub methode2(){  
        my $self=shift;  
        if($self->{eigenschaft} == ''){ # warum ist dieser Ausdruck hin+wieder wahr?  
          return '###'.$self->{eigenschaft};  
        }  
        else{  
          return $self->{eigenschaft};  
        }  
      }
      

      dieses Beispiel ist aber lauffähig

      als Ausgabe erhalte ich z.B.
      afabf0ab0d65ed122d8a2aa444d8c4a085fca7a27d37d10089
      ###afabf0ab0d65ed122d8a2aa444d8c4a085fca7a27d37d10089
      afabf0ab0d65ed122d8a2aa444d8c4a085fca7a27d37d10089

      folgendes Beispiel schlägt bei mit immer fehl

      use strict;  
        
      sub new {  
        my $self = shift;  
        return bless {  
          eigenschaft => '',  
        }, ref $self || $self;  
      }  
      sub methode1(){  
        my $self=shift;  
        $self->{eigenschaft} = 'a';  
        print $self->{eigenschaft}."\n"; # liefert das richtige Ergebnis  
        print &methode2($self)."\n"; # liefert das falsche Ergebnis  
        print $self->{eigenschaft}."\n"; # liefert das richtige Ergebnis  
      }  
      sub methode2(){  
        my $self=shift;  
        if($self->{eigenschaft} == ''){ # warum ist dieser Ausdruck wahr?  
          return '###'.$self->{eigenschaft};  
        }  
        else{  
          return $self->{eigenschaft};  
        }  
      }
      

      Ausgabe:
      a
      ###a
      a

      Danke!

      1. sorry - ich hab wohl das Beispiel zu sehr gekürzt ;-)

        wie auch dieses hier.
        Du solltest dir auch die Warnungen anzeigen lassen.

        In die 1. Zeile gehört das:
        #!/usr/bin/perl -w

        Struppi.

        1. sorry - ich hab wohl das Beispiel zu sehr gekürzt ;-)

          wie auch dieses hier.
          Du solltest dir auch die Warnungen anzeigen lassen.

          In die 1. Zeile gehört das:
          #!/usr/bin/perl -w

          in der Datei, wo die pm Datei per use eingebunden wird, war das -w vorhanden. Ich habe die Zeile "#!/usr/bin/perl -w" jetzt auch mal in der pm Datei hinzugefügt.

          Es wurden aber trotzdem keine Fehler im Browser angezeigt.

          Nach dem ich es auf der Konsole gestartet hatte, bekam ich die Meldung dass == falsch ist.

          Ich muss mich erst einmal an das eq gewöhnen :-\

          Danke!

          1. sorry - ich hab wohl das Beispiel zu sehr gekürzt ;-)

            wie auch dieses hier.
            Du solltest dir auch die Warnungen anzeigen lassen.

            In die 1. Zeile gehört das:
            #!/usr/bin/perl -w

            in der Datei, wo die pm Datei per use eingebunden wird, war das -w vorhanden. Ich habe die Zeile "#!/usr/bin/perl -w" jetzt auch mal in der pm Datei hinzugefügt.

            Es wurden aber trotzdem keine Fehler im Browser angezeigt.

            Bisher war nicht von einem Browser die Rede, starte das Skript mal in der Konsole (DOS Fenster).

            Nach dem ich es auf der Konsole gestartet hatte, bekam ich die Meldung dass == falsch ist.

            Genau.
            Falls du nicht immer in der Konsole testen möchtest.

            use CGI::Carp qw(fatalsToBrowser warningsToBrowser);  
            use CGI;  
            print CGI::header();  
            warningsToBrowser(1);  
            
            

            Dann stehen die Warnungen im HTML Quelltext als Kommentare.

            Struppi.

        2. In die 1. Zeile gehört das:
          #!/usr/bin/perl -w

          naja, ob -w oder use warnings... die Meinungen hierzu sind sehr
          umstritten ;-)

          --
          What is a good module? That's hard to say.
          What is good code? That's also hard to say.
          One man's Thing of Beauty is another's man's Evil Hack.