modifiziere $ _ wenn keine Parameter angegeben sind

8

Ich habe diese trim Routine:

%Vor%

Es trimmt Whitespace "an Ort und Stelle", d. h.:

%Vor%

trimmt die Leerzeichen von $ x und $ y (ändert sie).

Wie kann ich trim so verbessern, dass ich es so nennen kann:

%Vor%

und das ist das gleiche wie:

%Vor%

?

    
JoelFan 25.01.2012, 23:56
quelle

3 Antworten

11

Sie müssen lediglich @_ durch @_ ? @_ : $_ im Argument zur for Schleife ersetzen.

%Vor%

Nach Ikegamis Antwort gibt es die quälende Frage, was man gegen die Plage tun kann, die lexikalisch $_ ist (erklärt mit my $_; ), da diese Version von $_ nicht global ist, sondern an ein lexikalisches Pad gebunden ist.

Der (_) -Prototyp ist eine Möglichkeit, dieses Problem zu lösen, aber es bedeutet auch, dass die Subroutine nur ein Argument benötigt und dass das Argument skalaren Kontext hat, was es genauso schlimm macht wie der ($) -Prototyp (fällig zu unbeabsichtigten Folgen des skalaren Kontextes).

Wenn Sie versuchen, auf Lexika zu zaubern, ist das Modul PadWalker nützlich. Also hier ist eine Version, die korrekt auf Listen funktioniert, funktioniert sowohl auf lexikalischen als auch auf globalen $_ , und es stellt keinen skalaren Kontext auf der Aufrufseite dar:

%Vor%

Persönlich vermeide ich nur lexikalische $_ und hässliche Probleme wie diese verschwinden einfach. Aber wenn Sie es unterstützen müssen, ist dies ein Weg.

    
Eric Strom 26.01.2012, 02:05
quelle
11

Überprüfen Sie, ob keine Argumente vorhanden sind:

%Vor%

Dies erzeugt die Ausgabe

%Vor%     
user554546 25.01.2012 23:58
quelle
4

Wenn Ihr trim nur ein Argument verwendet, können Sie den _ -Prototyp verwenden.

%Vor%

Dann würden alle diese funktionieren:

%Vor%

Aber da Ihr trim eine Liste von Argumenten enthält, können Sie den _ -Prototyp nicht verwenden. Sie müssen @_ ? @_ : $_ verwenden.

%Vor%

Aber das heißt, es wird nicht mit lexikalischen $_ funktionieren.

%Vor%     
ikegami 26.01.2012 02:38
quelle

Tags und Links