Sie müssen lediglich @_
durch @_ ? @_ : $_
im Argument zur for
Schleife ersetzen.
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:
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.
Überprüfen Sie, ob keine Argumente vorhanden sind:
%Vor%Dies erzeugt die Ausgabe
%Vor% Wenn Ihr trim
nur ein Argument verwendet, können Sie den _
-Prototyp verwenden.
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.
Aber das heißt, es wird nicht mit lexikalischen $_
funktionieren.
Tags und Links perl