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 nicht return undef;.
der Vollständigkeit halber, es gibt noch wantarray!
Du möchtest also folgendes vorschlagen?
  
sub always_false  
{  
  if (defined wantarray) {  
    if (wantarray) {  
      return (); 
    } else {  
      return undef; 
    }  
  } else {  
    return; 
  }  
}  
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; 
    } else {  
      return undef; 
    }  
  } else {  
    return; 
  }  
}  
Schritt 2: return; liefert im Scalar-Context den undefinierten wert, undef ist redundant:
  
sub always_false  
{  
  if (defined wantarray) {  
    if (wantarray) {  
      return; 
    } else {  
      return; 
    }  
  } else {  
    return; 
  }  
}  
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; 
  } else {  
    return; 
  }  
}  
Schritt 4: Deja vu -- noch eine redundante if-then-else-Konstruktion. Weg damit:
  
sub always_false  
{  
  return; 
}  
q.e.d.
Alexander
-- 
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".