Eigenschaft setzen - komisches Verhalten
Perl Anfänger
- perl
0 Patrick Andrieu
0 Perl Anfänger0 Struppi
0 Perl Anfänger0 Struppi
0 bloonix
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
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
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!
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.
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!
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.
In die 1. Zeile gehört das:
#!/usr/bin/perl -w
naja, ob -w oder use warnings... die Meinungen hierzu sind sehr
umstritten ;-)