Mögliche Wege:
Verwenden Sie push :
%Vor%Verwenden des bedingten Operators :
%Vor% Verwenden des x!!
Booleschen Listen-Squash-Operators :
Welcher ist besser und warum?
Nun, sie alle machen verschiedene Dinge.
Allerdings sind alle anderen Faktoren gleich,
%Vor%ist die Aussage, die ihre Bedeutung am unmittelbarsten vermittelt, daher sollte sie bevorzugt werden.
Wenn Sie eine Aussage pausieren müssen, die angeblich etwas so Einfaches wie das Schieben eines Array-Elements tut, tun Sie etwas falsch.
%Vor%könnte OK sein, wenn dies Teil einer kolossalen Initialisierung ist, die an anderer Stelle ausgeführt wird.
Ich denke mit
%Vor%zeigt an, dass der Programmierer - wie kann ich das setzen? - Probleme .
Übrigens gibt es keinen so genannten zusammengesetzten Operator x!!
. Die !!
ist doppelte logische Negation . Er konvertiert einen beliebigen falschen Wert in einen definierten, aber falschen Wert (die leere Zeichenfolge), der 0
liefert, wenn perl
eine Zahl erwartet. Ein echter Wert wird in 1
konvertiert. Hier wirkt !!
auf $foo
und $bar
und das Schreiben von x!! $foo
verschleiert unnötigerweise die Bedeutung des Codes.
x
ist der Wiederholungsoperator . Also,
bedeutet wiederhole ('foo')
einmal oder gar nicht, abhängig davon, ob $foo
wahr oder falsch ist, bzw. .
PS: Natürlich stellt sich heraus, dass es einen PerlMonks-Artikel gibt, in dem der sogenannte -Boolean vorgestellt wird Liste Squash-Operator . Ich lese den Artikel und finde es nicht überzeugend.
Ich würde gerne vorschlagen, was ich den "lesbaren" Ansatz nennen soll:
%Vor% Es hat viele Vorteile dieses angeblichen x!!
Operators (obwohl etwas länger), aber mit dem zusätzlichen Bonus, dass Sie Ihren Code wirklich verstehen können, wenn Sie später darauf zurückkommen.
BEARBEITEN: Der Prototyp hilft Perl nicht besser zu parsen und lässt uns nicht die Klammern entfernen, es verhindert nur, dass Perl Dinge tut, die wir nicht wollen. Wenn wir die Parens aufgeben wollen, müssen wir etwas arbeiten. Hier ist eine alternative Version, die ohne Klammern funktioniert:
%Vor% Egal, was wir mit Prototypen machen, Perl wird versuchen, es als maybe("foo", $foo, maybe("bar", $bar))
zu parsen. Wenn wir also die Klammern entfernen wollen, müssen wir nur das richtige Ergebnis liefern.
Obwohl das OP dies nicht gefordert hat, bot mir dieses Problem eine gute Ausrede für use Benchmark;
Hier ist der Code:
%Vor%Und hier sind einige typische Ergebnisse:
%Vor% Gegeben brian d foys 7% Schätzung für Benchmark
's Unsicherheit, es scheint definitiv wie push
ist der schnellste Weg zu wachsen.
Zusammenfassung:
%Vor% Persönlich verwende ich $foo ? 'foo' : ()
in solchen Fällen, da es klar ist (im Vergleich zu ('foo') x!! $foo
), keinen besonderen Aufwand erfordert (im Vergleich zu ('foo') x !!$foo
) und im Listenkontext verwendet werden kann ( im Vergleich zu push @list, 'foo' if $foo;
).
Aber natürlich hängt die Antwort davon ab, nach welchen Kriterien Sie die beste Option wählen. Wenn Sie sie durch Verschleierung vergleichen, wird ('foo') x!! $foo
sicherlich gewinnen. Wenn Sie sie nach Ungeschicklichkeit vergleichen, wird push @list, 'foo' if $foo;
die erste sein. Oder vielleicht hast du Leistung gemeint? Ich denke nicht: -)
Aber wenn Sie sie mit gutem Stil vergleichen, ist meine Wahl $foo ? 'foo' : ()
.