Alle Variablen, egal, ob Skalare, Listen- bzw. Array-Elemente oder Hash-Elemente, sind, bis sie mit etwas belegt werden, undefiniert bzw. den Wert undef.
Will man prüfen, ob eine Variable definiert ist, kann man den Befehl defined verwenden.
Syntax
$defined_or_not=defined $variable;
oder meist auch in einer if-Struktur
if (defined $variable){ }
Als Rückgabewert bekommt man eine 1 bzw. eine 0, wenn wahr oder falsch.
my $einevariable='Testvariable'; my $nocheine=''; my $undnocheine='Die Letzte'; undef $undnocheine;
print "$einevariable\n" if defined ($einevariable); print "$nocheine\n" if defined ($nocheine); print "$undnocheine\n" if defined ($undnocheine);
Ausgabe:
Es werden zwei Zeilen ausgegeben, nämlich die Variable $einevariable und $nocheine. Da die Variable $undnocheine ge-undef-t wird, also einer definition entzogen wird, wird sie nicht ausgegeben.
Wie Sie sehen, ist auch ein leerer Skalar (oder auch Array-Eintrag oder Hash-Wert) definiert, ein "" ist also nicht gleich undef.
Was im ersten Beispiel mit einem Skalar funktioniert, läßt sich natürlich auch auf Arrays und Hashes anwenden.
@array=(0,1,2,3,4,5);
$hash{key}='hash';
print $array[10]."\n" if defined $array[10]; print $hash{notdefined}."\n" if defined $hash{notdefined}; print $array[1]."\n" if defined $array[1]; print $hash{key}."\n" if defined $hash{key};
Ausgabe
1
hash
Zum Schluß die Frage: Wozu das alles?
Wenn ich eine Variable nicht definiert habe weiß ich das ja normalerweise, und eine Variable, die ich nicht definiert habe, verwende ich normalerweise auch nicht. Wozu also eine Funktion, die mir sagt, ob eine Variable definiert ist?
Nun, darauf gibt es verschiedene Antworten. Eine wäre das folgende Beispiel:
use strict; my @array=();
$array[5]='Ich bin Wert 6'; foreach (@array){
if (defined $_){ print "$_\n";
# und tu nochwas vernünftiges
}
}
Das Array wird zu Beginn des Scriptes mit 6 Werten belegt, nämlich fünfmal mit undef und einmal mit "Ich bin Wert 6".
Danach wird per Schleife jeder Wert abgefragt und wenn definiert verarbeitet.
Und was will uns der Autor nun damit sagen? Nun, daß man eben nicht immer weiss, ob eine Variable definiert ist!
Und nochwas, ich erwähnte das schon mal irgendwo:
Ein Skalar kann 2 Werte speichern, gleichzeitig!
Ein
print "Gibts eine Maus?\n";
if (defined $werte{$gesuchtwird}) {print "yo!\n";} else {print "Nö, kenn ich nicht\n"; exit;} print "Wie macht die $gesuchtwird?\n"; print "Die Maus $werte{$gesuchtwird}!\n";
Ausgabe:
Gibts eine Maus?
yo!
Wie macht die Maus?
Die Maus piept!
Wahrlich, kein weltbewegendes Beispiel, aber es wird vielleicht klar was ich meine.
Kommentare zum Beitrag "Prüfen ob Variable belegt ist - defined in Perl"
Kommentar von Edwin Bain
Kompliment, sehr gut beschreibt :-)
Saludos
Edwin
Kommentar von Scream
Ja wirklich eine Nette Anleitung... hat mir sehr geholfen... Aber Hashes in Hashes wäre hier gut anbringbar :D
Kommentar von Mr. X
Echt gute Beschreibung :)
Hatte es irgentwie nie richtig verstanden wozu man dies benötigt :P