perl module use

perl - ¿Debo cambiar mis utilities.pl a un módulo utilities.pm?



module use (5)

Al hacer que su código se convierta en un módulo con la refactorización adecuada, lo hace fácil de probar. Hablo de esto en mi artículo "Scripts as Modules" para The Perl Journal , así como "Cómo un script se convierte en un módulo" en Perlmonks.

Buena suerte,

En nuestro producto, tenemos un gran archivo de utilidades que necesitamos (con "do") al principio de muchos de nuestros archivos. ¿Hay alguna razón para no convertir esto en un módulo? Por ejemplo, en lugar de hacer esto:

do ''../dbi_utilities.pl''; our ($db,$user,$pw,$attr); my $Data = DBI->connect($db,$user,$pw,$attr) or die "Could not connect to database: $DBI::errstr";

¿No podría simplemente hacer esto ?:

use AppUtil; my $Data = AppUtil->connect();

¿Cuáles son los pros y los contras de cada estilo?


Con do (), está cargando y compilando el archivo utilities.pl cada vez, lo que puede causar problemas si lo hace () más de una vez. Además, el use se realiza en compilación lo que permitirá que su programa falle antes, o incluso que se pruebe con perl -wc .

Por último, mantenerlo en un paquete le permite proteger su espacio de nombre, que puede ser útil a medida que su proyecto crece.

Aconsejaría encarecidamente convertir tu utilites.pl en un paquete Perl apropiado que esté cargado de use .


Hacer un módulo de eso lo hará mucho más robusto. En este momento, muchas cosas dependen informalmente unas de otras, pero esas dependencias no son inmediatamente obvias.

Además, le permitiría importar solo parte de las utilidades.


La única razón para no hacer esto es el tiempo.

Es decir, tomará tiempo limpiar su interfaz, así como todas las aplicaciones de llamadas para usar la nueva interfaz.

Lo que le costará a tiempo ahora estará más que compensado cuando comience a usar las pruebas adecuadas ("hacer prueba" o "./Build prueba" o simplemente "probar ...") y podrá comprobar que sus cambios no romperá nada antes de registrarlo. Entonces, por supuesto, conviértanse. Solo ten en cuenta que no es una ganancia gratis.


Obtienes todas las funciones geniales del módulo, la encapsulación, las funciones específicas del módulo, etc.

Sin embargo, tenga en cuenta que al use con su sintaxis. crear un objeto para el espacio de nombres de AppUtil y llamar a la subrutina de conexión. para tus utilidades

También debes tener 1; al final de tu archivo.

Seguir el otro método significa que no tiene que cambiar ningún código, no tiene que agregar 1 al final.

Todos "do", "use" y "require" import, pero el código de alcance que está dentro de ellos (excepto las subrutinas con nombre porque no pueden ocultarse).