In Perl, sollte eine Funktion den Wunscharray tanzen lassen, oder können wir erwarten, dass der Anrufer eine Karte benutzt?

8

Auf der (sehr geschätzten) Seite perlmonks habe ich die folgender Ausschnitt, der die Leerzeichen von beiden Seiten eines Strings abschneidet:

%Vor%

Ich verstehe nicht, warum der Autor all die Mühe macht, fast jede Zeile zu überprüfen. Warum nicht einfach die Zeichenkette trimmen und den Programmierer map benutzen lassen, wenn er ein Array passiert?

Was ist der Unterschied zwischen dieser Trimmung, die so heißt:

%Vor%

Oder eine einfache Trimmung, die so heißt, wenn man ein Array trimmen muss:

%Vor%     
Konerak 16.01.2012, 08:52
quelle

4 Antworten

11

Zunächst ist es besser, wenn Sie diese Karte abstrahieren:

%Vor%

Betrachten Sie als zweites das obige Beispiel und vergleichen Sie es mit:

%Vor%

Was ist der Unterschied?

e.1. gibt ein neues getrimmtes Array zurück, während e.2. Ändert das ursprüngliche Array.

Ok, was macht das ursprüngliche kryptische Unterprogramm?

Es magisch (yeah, es ist Perl) ändert das ursprüngliche Array , wenn Sie den Rückgabewert nichts zuweisen ODER belassen das ursprüngliche Array unberührt und gibt ein neues getrimmtes Array zurück if Sie weisen den Rückgabewert einer anderen Variablen zu .

Wie?

Durch Überprüfen, ob ein Sucharray überhaupt definiert ist. Solange die Funktion auf der rechten Seite ist und der Rückgabewert einer Variablen "defined willarray" zugewiesen ist, ist dies wahr (unabhängig vom Skalar / Array-Kontext).

    
Nylon Smile 16.01.2012, 10:47
quelle
7

Dies wird zeilenweise unterbrochen:

%Vor%

Ich stimme zu, dass der Code mit allen wantarray -Prüfungen ein wenig mühsam wird, aber das Ergebnis ist eine Funktion, die ein gewisses Maß an Flexibilität mit den eingebauten Funktionen von Perl teilt. Das Endergebnis, wenn die Funktion "intelligent" gemacht wird, besteht darin, die Aufrufseite zu bereinigen (Schleifenkonstrukte, temporäre Variablen, Wiederholung, ...), was je nach der Häufigkeit, mit der die Funktion verwendet wird, die Lesbarkeit des Codes verbessern kann.

Die Funktion könnte ein wenig vereinfacht werden:

%Vor%

Die ersten beiden Zeilen können zu einem zusammengerollt werden, da sie dasselbe tun (Zuweisung zu @_ ) nur mit unterschiedlichen Quellwerten. Und der äußere return ... if defined wantarray Check muss nicht am Ende gefunden werden, da die Rückgabe eines Wertes im void Kontext sowieso nichts bringt.

Aber ich würde wahrscheinlich die letzte Zeile in wantarray ? @_ : pop ändern, da dies dazu führt, dass sie sich wie eine Liste verhält (letztes Element im skalaren Kontext).

Wenn alles gesagt und getan ist, können die folgenden Aufrufstile verwendet werden:

%Vor%

und unterstützt sogar noch die Call-Site-Schleife:

%Vor%

oder ausführlicher als:

%Vor%

und es kann innerhalb einer while-Schleife ähnlich wie chomp

verwendet werden %Vor%

Meinungen über dwimmery in Perl sind gemischt. Ich persönlich mag es, wenn Funktionen mir die Flexibilität geben, den Aufrufer auf sinnvolle Weise zu codieren, anstatt die starre Schnittstelle einer Funktion zu umgehen.

    
Eric Strom 18.01.2012 07:24
quelle
5

Wahrscheinlich wollte der Autor das Verhalten der Standardfunktion chomp nachahmen. Es ist nicht notwendig, dies in Ihrer eigenen Funktion zu tun.

%Vor%      

[...] Wenn du eine Liste chompst, wird jedes Element chomped. [...]

    
kubanczyk 16.01.2012 09:09
quelle
1

Beachten Sie, dass Text :: Trim genau so implementiert ist. Siehe Beschreibung zu verschiedenen Anwendungsfällen. Bei Spielen mit wantarray können verschiedene Kontexte unterschieden und unterschiedliche Semantiken implementiert werden.

Persönlich bevorzuge ich nur einzelne Semantiken, da es einfacher zu verstehen und zu verwenden ist. Ich würde es vermeiden, $_ default variable oder modification anstelle von Nylon Smile's Beispiel 1 zu verwenden.

    
bvr 16.01.2012 11:41
quelle

Tags und Links