Alexander (HH): Subroutine return true / false?

Beitrag lesen

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 (); # 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".