Was ist die beste Möglichkeit, ein Element in eine Liste zu übernehmen?

7

Mögliche Wege:

  1. Verwenden Sie push :

    %Vor%
  2. Verwenden des bedingten Operators :

    %Vor%
  3. Verwenden des x!! Booleschen Listen-Squash-Operators :

    %Vor%

Welcher ist besser und warum?

    
Eugene Yarmash 19.02.2010, 11:53
quelle

4 Antworten

12

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,

%Vor%

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.

    
Sinan Ünür 19.02.2010, 12:03
quelle
5

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.

    
Chris Lutz 19.02.2010 13:20
quelle
2

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%     
Zaid 20.02.2010 15:09
quelle
1

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' : () .

    
codeholic 20.02.2010 08:24
quelle

Tags und Links