Manchmal brauche ich eine nützliche Dienstprogrammfunktion, wie List::Util::max
in der Mitte eines großen Programms, das viele Sachen macht. Also, wenn ich an der Spitze von meinem ProgrammLexikalische Import von nützlichen Funktionen in einem großen Skript
use List::Util 'max';
tun, ich bin mit diesem Symbol stecken, meinen ganzen Namensraum verschmutzen, obwohl ich es nur in einem Unterprogramm benötigen.
use List::Util();
# a whole bunch of stuff later...
sub blah {
List::Util->import('max');
$blah = max @foobar;
...
}
Es gibt zwei Probleme mit diesem, aber:
ein anderes Muster zu versuchen, anstatt So denke, ich habe. Zum einen wird es nicht automatisch am Ende des Blocks unimport (drat.) Müsste ich alles mit einem unimport
rückgängig machen.
Das andere Problem ist, dass anscheinend Prototypen nicht richtig angewendet werden, so muss ich max(@foobar)
anstelle der hübscheren Klammer-Version sagen.
Gibt es eine einfache Möglichkeit, Symbole für einen Block vorübergehend zu importieren, was automatisch dazu führen würde, dass sie am Ende des Blocks weggehen, und auch Prototypen richtig handhaben?
Dies wird subtile Fehler einführen, wenn 'max' einen Prototyp hat, da der Effekt davon zur Kompilierzeit eingebrannt wird. In 'max2' wird der Prototyp von' main :: max' verwendet, nicht der von 'List :: Util :: max'. Hilfsweise sollten Sie eine Warnung über die fehlende Übereinstimmung des Prototyps bei der Zuweisung erhalten. –
@Eric Strom - Guter Punkt, das würde saugen. Verwenden Sie einen 'lokalen' Unterprogrammnamen mit Vorsicht. – mob