Moin Moin!
»» Gibt die Routine immer einen Skalar zurück, wird der eben in eine Liste verwandelt. Da kann man nicht viel dran ändern. Deshalb ja auch
return;
und nichtreturn undef;
.der Vollständigkeit halber, es gibt noch wantarray!
Du möchtest also folgendes vorschlagen?
sub always_false
{
if (defined wantarray) {
if (wantarray) {
return (); # List context: leere Liste
} else {
return undef; # Scalar context: undef
}
} else {
return; # void context: NIX -- oder genauer: es ist völlig egal, weil es dem caller am A... vorbeigeht.
}
}
Spätestens wenn ich sowas ernsthaft in den Editor hacke, bekommt der Editor ein kill -9, und ich gehe SCHLEUNIGST ins Bett. Denn das ist ein sicheres Zeichen dafür, dass das Gehirn längst auf Standby läuft.
Aber sei's drum: Optimieren wir diesen Murks mal etwas. Zunächst liefert return;
im List-Context eine leere Liste, die Klammern sind redundant:
sub always_false
{
if (defined wantarray) {
if (wantarray) {
return; # List context: leere Liste
} else {
return undef; # Scalar context: undef
}
} else {
return; # void context: NIX
}
}
Schritt 2: return;
liefert im Scalar-Context den undefinierten wert, undef
ist redundant:
sub always_false
{
if (defined wantarray) {
if (wantarray) {
return; # List context: leere Liste
} else {
return; # Scalar context: undef
}
} else {
return; # void context: NIX
}
}
Schritt 3: Das innere if-then-else enthält für then und else bis auf die Kommentare exakt den selben Code-Block. Einer der beiden Blöcke und die gesamte if-then-else-Konstruktion kann also entfallen, die Kommentare sind zu bereinigen:
sub always_false
{
if (defined wantarray) {
return; # List context: leere Liste, Scalar context: undef
} else {
return; # void context: NIX
}
}
Schritt 4: Deja vu -- noch eine redundante if-then-else-Konstruktion. Weg damit:
sub always_false
{
return; # List context: leere Liste, Scalar context: undef, void context: NIX
}
q.e.d.
Alexander
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".