"return" vs. "return undef"

22/02/2011 - 10:39 von Manuel Reimer | Report spam
Hallo,

kann mir jemand erklàren, wo genau der Unterschied zwischen diesen
beiden Varianten ist:

sub test {
return;
}
my ($var1, $var2) = test() or die("Fehler");

und

sub test {
return undef;
}
my ($var1, $var2) = test() or die("Fehler");

Bei "return undef" bekomme ich keinen Fehlerstatus. Bei einfachem
"return" funktioniert alles wie gewünscht.

Noch konfuser wird es, wenn man statt zwei Werten nur einen erwartet.
Also

my $var3 = test() or die("Fehler");

In dieser Variante verhàlt sich "return undef" genau so wie "return".
Ich bekomme in beiden Fàllen eine Fehlermeldung.

Gibt es eine Regel, wie man aus einer Unterfunktion einen Fehlerstatus
zurückmeldet? "return undef" scheint dafür ja nicht immer zu
funktionieren. Wenn mehr als ein Wert zurückgegeben wird, funktioniert
dann die Fehler-Abfrage nicht.

Gruß

Manuel

"Alle Macht geht vom Volk aus - aber wo geht sie hin?" - Bertolt Brecht
Alle wollen zurück zur Natur - aber keiner zu Fuß
Beitràge mit *X-No-Html Header* kann ich weder lesen, noch beantworten!
 

Lesen sie die antworten

#1 J. Strübig
22/02/2011 - 10:56 | Warnen spam
Am 22.02.2011 10:39, schrieb Manuel Reimer:
Hallo,

kann mir jemand erklàren, wo genau der Unterschied zwischen diesen
beiden Varianten ist:

sub test {
return;
}
my ($var1, $var2) = test() or die("Fehler");

und

sub test {
return undef;
}
my ($var1, $var2) = test() or die("Fehler");

Bei "return undef" bekomme ich keinen Fehlerstatus. Bei einfachem
"return" funktioniert alles wie gewünscht.



Das Problem ist hier die Rangfolge der Operatoren. or kommt erst nach
der Zuweisung zum tragen.

#!/usr/bin/perl -w
use strict;
my($v1, $v2);

# Diese Ausdrücke sind im Prinzip identisch
($v1, $v2) = f() or warn 'undef';
(($v1, $v2) = f()) or warn 'undef';
(($v1, $v2) = f()) || warn 'undef';

# Dieser macht was du erwartest
($v1, $v2) = f() || warn 'undef';

sub f{
return undef;
}

Noch konfuser wird es, wenn man statt zwei Werten nur einen erwartet. Also



or kommt in diesem Fall immer zuletzt, d.h. erst wird undef an $var3
zugewiesen und or prüft ob $var3 "wahr" ist.

Struppi.

Ähnliche fragen