2022-07-28T07:59:41
KuerbisIst kontextabhängiges Verhalten von Funktionen böse?
"Böse"? Nein. Mit Vorsicht zu geniessen: Ja.
Das Problem an
wantarray ist: Es gibt keinen "Array Kontext", sondern einen Listen-Kontext. Die Funktion heißt aber nicht
wantlist, und ob der Programmierer ein
Array will, ist damit gar nicht ausgedrückt. Auch in dem Artikel geht es um den etwas trickreichen Unterschied zwischen einer Liste und einem Array.
Ein ganz typischer Fehler ist:
sub f {
return wantarray
? (qw/L i s t e/)
: 'Skalar';
}
my %hash = ( key => f() );
Bei der Erstellung von
%hash will man definitiv kein Array. Perl ist bei der Zuweisung aber im Listen-Kontext, und so entsteht hier ein Hash mit den Schlüsseln
key,
i und
t.
Meine Empfehlung ist: Wann immer eine Funktion mehrere Werte zurückgeben kann, soll sie das klar und deutlich beschreiben, und auch, was in skalarem Kontext passiert. Das hat mit
wantarray nichts zu tun.
In Deinem Fall fungiert der Kontext als Input für Deine Funktion. Als Alternativen ohne
wantarray könntest Du entweder zwei Routinen
choose_single und
choose_multiple oder einen zusätzlichen Parameter anbieten. Auch dann musst Du definieren, was zurückkommt, falls jemand
choose_multiple in skalarem Kontext aufruft. Ist das dann besser? Meiner Meinung nach: nein.
Als Anwender von
choose muss ich mir sowieso überlegen, ob ich einen oder mehrere Werte zulassen will. Wenn ich das dadurch zum Ausdruck bringen kann, dass ich in einen Skalar oder ein Array zuweise, dann ist das für mich DWIM im positivien Sinn!
Die
Perl::Critic Policy ist ein bisschen neben der Spur. Dass Funktionen Listen zurückgeben können, und dass sie wahlweise in skalarem oder Listen-Kontext aufgerufen werden können, hat mit
wantarray nichts zu tun. Wer
wantarray verwendet, ist sich dieser Tatsache zumindest bewusst!