¿Es obligatorio que una carpeta con el nombre de un paquete esté presente para crear un paquete?

StackOverflow https://stackoverflow.com/questions/468818

  •  19-08-2019
  •  | 
  •  

Pregunta

Estamos factorizando el código común de nuestro proyecto Perl. Un programa principal debe dividirse en varios módulos reutilizables.

El nombre de nuestro programa es validate_results.pl que contiene un conjunto de comandos de validación. Estamos planeando dividir esto en pequeños módulos para que validate_results.pl sea así:

use Common::Validate_Results;
use Common::Validate_Results::CommonCommands;
use Common::Validate_Results::ReturnCodeValidation;
...

Según tengo entendido, debería crear una carpeta común y debajo de eso Validate_Results.pm debería estar presente. Nuevamente, en Común , se debe crear la carpeta Validate_Results y debajo de esa carpeta CommonCommands y ReturnCodeValidation .

¿Es obligatorio que todas estas carpetas estén presentes o podemos tener todos los programas de Perl en una sola carpeta y agruparlos lógicamente y aún usar la forma anterior para acceder a los módulos (por ejemplo, use common :: validate_results así).

¿Fue útil?

Solución

Se requiere la jerarquía del sistema de archivos. A :: B :: C siempre se ubicará en A / B / C.pm, en algún lugar de @INC.

Si tiene para solucionar esto, lea perldoc -f require , buscando específicamente la sección sobre referencias de subrutinas en @INC. Sí, puedes hacer que el cargador de módulos haga cosas raras si eso es lo que realmente quieres; Pero eso no es lo que quieres, confía en mí. Simplemente cumpla con la convención, como lo hace el otro 99.9999999% de las aplicaciones de Perl.

Otros consejos

Si quiere 'usar' sus módulos, entonces debe ajustarse a la estructura. Si desea evitar eso, puede 'requerir' sus módulos en su lugar, pasando el nombre del archivo a requerir.

Realmente no deberías hacer esto, sin embargo. Si realmente no desea tener una estructura de directorio, quítela de los nombres de los módulos (aunque eso puede ocasionar problemas en el futuro si alguna vez tiene un nombre de módulo que entre en conflicto con algo más genérico de CPAN). Simplemente agregue el directorio de scripts a la ruta INC a través de Find :: Bin y use los módulos directamente:

use FindBin;
use lib $FindBin::Bin;

use ValidateResults;
use CommonCommands;
use ReturnCodeValidation;

HTH

Aquí hay un ejemplo de un módulo y sus submódulos en el mismo archivo:

package Foo;
use strict;
use Exporter 'import';

our @EXPORT = ( 'from_foo' );

sub from_foo { print "from_foo\n"; }

package Foo::Bar;
use strict;
use Exporter 'import';

our @EXPORT = ( 'from_foo_bar' );

sub from_foo_bar { print "from_foo_bar\n"; }

1;

En su programa, si usa el módulo Foo (el que tiene un archivo .pm):

use Foo;

Tendrá acceso a las funciones Foo :: Bar , excepto solo como nombres canónicos (Foo :: Bar :: from_foo_bar). Puede importarlos así:

use Foo;
Foo::Bar->import;

Tenga en cuenta que no puede hacer esto:

use Foo::Bar;

Porque no hay archivo Foo / Bar.pm .

El nombre del paquete en un comando 'use' es efectivamente solo una ruta que termina con un archivo .pm, por lo que no necesita una carpeta con el nombre de cada paquete. En su ejemplo, necesita carpetas:

Common
Common/Validate_Results

Pero no necesita carpetas:

Common/Validate_Results/CommonCommands
Common/Validate_Results/ReturnCodeValidation

El nombre real del paquete en el archivo .pm no tiene que ser el mismo que el nombre en el comando 'use' que lo carga. Pero mantener las rutas consistentes con los nombres de los paquetes siempre es una buena idea.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top