open - En Perl, ¿cuál es la diferencia entre un archivo.pm(módulo Perl) y un archivo.pl(script Perl)?
perl open fh (2)
A .pl es un script único.
En .pm ( Módulo Perl ) tiene funciones que puede utilizar desde otros scripts de Perl:
Un módulo Perl es una pieza autónoma de código Perl que puede ser utilizada por un programa Perl o por otros módulos Perl. Es conceptualmente similar a una biblioteca de enlaces C, o una clase C ++.
¿Cuál es la diferencia entre el .pm
(módulo Perl) y el archivo .pl
(script Perl)?
Por favor también dime por qué devolvemos 1
del archivo. Si devuelve 2 o cualquier otra cosa, no está generando ningún error, entonces, ¿por qué devolvemos 1
desde el módulo Perl?
En esencia, la extensión de archivo que utiliza no hace ninguna diferencia en cuanto a cómo perl
interpreta esos archivos.
Sin embargo, poner módulos en archivos .pm
siguiendo una cierta estructura de directorios que sigue el nombre del paquete proporciona una conveniencia. Entonces, si tienes un módulo Example::Plot::FourD
y lo pones en un directorio Example/Plot/FourD.pm
en una ruta en tu @INC
, entonces use
y require
hará lo correcto cuando se le dé el nombre del paquete como en use Example::Plot::FourD
.
El archivo debe devolver verdadero como la última instrucción para indicar la ejecución exitosa de cualquier código de inicialización, por lo que es habitual finalizar dicho archivo con
1;
a menos que esté seguro de que volverá a ser cierto de lo contrario. Pero es mejor poner el1;
, en caso de que agregue más declaraciones.Si
EXPR
es una palabra clave, elrequire
asume una extensión ".pm" y reemplaza "::" con "/" en el nombre del archivo por usted, para que sea más fácil cargar módulos estándar. Esta forma de carga de módulos no corre el riesgo de alterar su espacio de nombres.
Todo lo que hace el usuario es averiguar el nombre del archivo a partir del nombre del paquete proporcionado, require
en un bloque BEGIN
e invocar la import
en el paquete. No hay nada que le impida no usar el use
pero seguir estos pasos manualmente.
Por ejemplo, a continuación puse el paquete Example::Plot::FourD
en un archivo llamado t.pl
, lo t.pl
en un script en el archivo s.pl
C:/Temp> cat t.pl
package Example::Plot::FourD;
use strict; use warnings;
sub new { bless {} => shift }
sub something { print "something/n" }
"Example::Plot::FourD"
C:/Temp> cat s.pl
#!/usr/bin/perl
use strict; use warnings;
BEGIN {
require ''t.pl'';
}
my $p = Example::Plot::FourD->new;
$p->something;
C:/Temp> s
something
Este ejemplo muestra que los archivos de módulo no tienen que terminar en 1
, cualquier valor verdadero servirá.