Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]6307[/thread]

perl variablen leer ?: to initiier or not to initiier ?

Leser: 1


<< |< 1 2 >| >> 20 Einträge, 2 Seiten
rio
 2004-06-02 22:39
#82946 #82946
User since
2004-05-31
105 Artikel
BenutzerIn
[default_avatar]
hi , nochma ne frage , sind perl variablen initiert ?

wenn ich nur

my $loginname
ist dann $loginname eq "" ?

funktioniert das dann nur wenn ich glück habe oder sind die variablen immer komplett lehr beim erstellen?

ich frage deswegen weil ichs von c her kenne das da immer irgendwas drinne steht solange man nichts initialisiert

thx
sri
 2004-06-02 22:49
#82947 #82947
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
Probier es doch einfach aus!!! *slap*

Code: (dl )
perl -e 'print "VARIABLEN SIND IMMER UNDEF!\n" if my $test eq undef'
Dubu
 2004-06-02 23:56
#82948 #82948
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Schlechtes Beispiel, da du durch 'eq' beide Seiten in den String-Kontext zwingst. Genauso koenntest du schreiben
Code: (dl )
perl -e 'print "VARIABLEN SIND IMMER LEERSTRINGS!\n" if my $test eq ""'

oder
Code: (dl )
perl -e 'print "VARIABLEN SIND IMMER NULL!\n" if my $test == 0'


Was du meinst, ist wohl eher sowas:
Code: (dl )
perl -e 'print "VARIABLEN SIND IMMER UNDEF!\n" unless defined my $test'
pktm
 2004-06-03 00:30
#82949 #82949
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
zu prüfen übrigens mit defined( $myvar );
Der Übersicht habler um anderen Programmierern z.B. zu verdeutlichen, welche Variablen Leerstrings sind und welche einfach nur undef sein sollen soll man undefinierte Vraiblen my $myvar = undef; schreiben.
Welch ein Satz!
http://www.intergastro-service.de (mein erstes CMS :) )
sri
 2004-06-03 04:09
#82950 #82950
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=Dubu,02.06.2004, 21:56]Schlechtes Beispiel, da du durch 'eq' beide Seiten in den String-Kontext zwingst. Genauso koenntest du schreiben
Code: (dl )
perl -e 'print "VARIABLEN SIND IMMER LEERSTRINGS!\n" if my $test eq ""'

oder
Code: (dl )
perl -e 'print "VARIABLEN SIND IMMER NULL!\n" if my $test == 0'


Was du meinst, ist wohl eher sowas:
Code: (dl )
perl -e 'print "VARIABLEN SIND IMMER UNDEF!\n" unless defined my $test'
[/quote]
Das Beispiel ist völlig egal.

Nicht initialisierte Scalare (SvNULL) sind in jedem Kontext equivalent zu "undef", erst mit einer Wertezuweisung gelten dann die jeweilig spezifischen Kontext Regeln des Wertes. (String, Number, Reference)

Genaugenommen ist SvNULL gar nicht in der Lage einen Wert zu haben, deshalb lässt sich bloss sagen das es "undef" ist. ;)\n\n

<!--EDIT|sri|1086222078-->
Dubu
 2004-06-03 12:56
#82951 #82951
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=sri,03.06.2004, 02:09]Das Beispiel ist völlig egal.

Nicht initialisierte Scalare (SvNULL) sind in jedem Kontext equivalent zu "undef", erst mit einer Wertezuweisung gelten dann die jeweilig  spezifischen Kontext Regeln des Wertes. (String, Number, Reference)[/quote]
Wenn du einen undefinierten Wert neben einen Vergleichsoperator setzt, erzwingst du einen Kontext. Daher kommt es, dass undef == 0 und undef eq "" beide wahr ergeben. Ein Vergleich ist somit eine schlechte Methode um herauszufinden, ob ein Wert undef ist. Die Pruefung mit defined(...) ist der richtige Weg.

Ich haette auch sowas schreiben koennen:
Code: (dl )
perl -e '$test = 0; print "VARIABLEN SIND IMMER UNDEF!\n" if my $test eq undef'

$test ist einwandfrei nicht undef, aber der Vergleich ist wahr.
esskar
 2004-06-03 13:00
#82952 #82952
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=Dubu,03.06.2004, 10:56]
Code: (dl )
perl -e '$test = 0; print "VARIABLEN SIND IMMER UNDEF!\n" if my $test eq undef'

$test ist einwandfrei nicht undef, aber der Vergleich ist wahr.

sri hat schon recht! :)[/quote]
jein...
das erste auftreten von $test ist tatsälich nicht undef;
jedoch ist das zweite auftreten schon undef

vergeleich

Code: (dl )
1
2
3
perl -e '$test = 0; print "VARIABLEN SIND IMMER UNDEF!\n" if my $test eq undef'

perl -e '$test = 0; print "VARIABLEN SIND IMMER UNDEF!\n" if $test eq undef'
Dubu
 2004-06-03 13:58
#82953 #82953
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Sorry, das mit dem my und 'eq' war natuerlich falshc.
Eine 0 ist in einem Stringvergleich natuerlich nicht das gleiche wie undef.

Es sollte heissen:
Code: (dl )
perl -e '$test = 0; print "VARIABLEN SIND IMMER UNDEF!\n" if $test == undef'


Aequivalent mit einem Leerstring und 'eq':
Code: (dl )
perl -e '$test = ""; print "VARIABLEN SIND IMMER UNDEF!\n" if $test eq undef'
sri
 2004-06-03 17:03
#82954 #82954
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=Dubu,03.06.2004, 11:58]Sorry, das mit dem my und 'eq' war natuerlich falshc.
Eine 0 ist in einem Stringvergleich natuerlich nicht das gleiche wie undef.

Es sollte heissen:
Code: (dl )
perl -e '$test = 0; print "VARIABLEN SIND IMMER UNDEF!\n" if $test == undef'


Aequivalent mit einem Leerstring und 'eq':
Code: (dl )
perl -e '$test = ""; print "VARIABLEN SIND IMMER UNDEF!\n" if $test eq undef'
[/quote]
Das Beispiel ist egal!!!

Es ging die ganze Zeit darum zu zeigen das scalare leer sind! ;)
Crian
 2004-06-04 15:09
#82955 #82955
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
[quote=sri,02.06.2004, 20:49]Probier es doch einfach aus!!! *slap*[/quote]
Bei Perl mag das die geeignete Methode sein, bei C++ habe ich gelernt, mich nicht auf die Verhaltensweise meines Compilers zu stützen, sondern lieber nachzufragen, was der Standard dazu sagt.
Bei C/C++ machen es manche Compiler so manche anders, bei einigen kann man einstellen, ob und wenn ja was in den Speicherbereich uninitialisierter Variablen geschrieben werden soll. Das kann zum Debuggen sehr nützlich sein, weil man dann, wenn man auf das entsprechende Muster trifft, ziemlich sicher davon ausgehen kann, dass da eine Variable nicht initialisiert wurde.

Aber natürlich hätte der OP trotzdem selbst probieren und berichten können, wie es sich bei ihm verhält und fragen, ob das gesichert ist, dass es immer so ist.

Also *slap* ruhig =)

P.S. Von mir ein *slap* für die Verwendung von "lehr" für "leer" ... hat man Dich denn nichts gelehrt? ;-)\n\n

<!--EDIT|Crian|1086347441-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< |< 1 2 >| >> 20 Einträge, 2 Seiten



View all threads created 2004-06-02 22:39.