A veces necesito una función de utilidad útil, como List::Util::max
en medio de un programa grande que hace muchas cosas. Así que si lo hagoImportación léxica de funciones útiles en un script grande
use List::Util 'max';
En la parte superior de mi programa, tengo que cargar con ese símbolo, contaminando toda mi espacio de nombres, aunque sólo lo necesito en una subrutina.
Así que he estado pensando en probar un modelo diferente, en su lugar:
use List::Util();
# a whole bunch of stuff later...
sub blah {
List::Util->import('max');
$blah = max @foobar;
...
}
Hay dos problemas con esto, sin embargo. Por un lado, no se desimporta automáticamente al final del bloque (drat.) Tendría que deshacer todo con un unimport
.
El otro problema es que aparentemente los prototipos no se aplican correctamente, así que tengo que decir max(@foobar)
en lugar de la versión sin parntesis más bonita.
¿Hay una manera fácil de importar temporalmente símbolos para un bloque, lo que automagicamente hacer que desaparezcan al final del bloque, y lo que también prototipos manejar correctamente?
Esto introducirá errores sutiles si cualquiera de los 'máximos' tiene un prototipo, ya que el efecto de eso se quemará en tiempo de compilación. En 'max2', se usa el prototipo de' main :: max', no el de 'List :: Util :: max'. De manera útil, debería recibir una advertencia sobre el prototipo de desajuste en la asignación. –
@Eric Strom - Buen punto, eso apestaría. Use un nombre de subrutina 'local' con precaución. – mob