¿Cuál es la diferencia entre .pm
(módulo Perl) y .pl
archivo (script Perl)?
Por favor, dígame también por qué regresamos 1
del archivo. Si devuelve 2 o cualquier otra cosa, no genera ningún error, entonces, ¿por qué regresamos 1
del módulo Perl?
¿Cuál es la diferencia entre .pm
(módulo Perl) y .pl
archivo (script Perl)?
Por favor, dígame también por qué regresamos 1
del archivo. Si devuelve 2 o cualquier otra cosa, no genera ningún error, entonces, ¿por qué regresamos 1
del módulo Perl?
Respuestas:
En esencia, la extensión de archivo que use no hace ninguna diferencia en cuanto a cómo perl
interpretar esos archivos.
Sin embargo, colocar módulos en .pm
archivos siguiendo una determinada estructura de directorio que sigue al nombre del paquete proporciona una comodidad. Entonces, si tiene un módulo Example::Plot::FourD
y lo coloca en un directorio Example/Plot/FourD.pm
en una ruta en su @INC
, entonces use
y require
hará lo correcto cuando le den el nombre del paquete como en use Example::Plot::FourD
.
El archivo debe devolver verdadero como la última declaración para indicar la ejecución exitosa de cualquier código de inicialización, por lo que es habitual terminar dicho archivo con a
1;
menos que esté seguro de que devolverá verdadero de lo contrario. Pero es mejor poner el1;
, en caso de que agregue más declaraciones.Si
EXPR
es una palabra básica,require
asume una extensión ".pm" y reemplaza "::" con "/" en el nombre del archivo 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 use
hace es averiguar el nombre del archivo a partir del nombre del paquete proporcionado, require
colocarlo en un BEGIN
bloque e invocarlo import
en el paquete. No hay nada que le impida no usar, use
sino tomar esos pasos manualmente.
Por ejemplo, a continuación puse el Example::Plot::FourD
paquete en un archivo llamado t.pl
, lo cargué en un script en 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á.
Un .pl es un único script.
En .pm ( Módulo Perl ) tiene funciones que puede usar desde otros scripts Perl:
Un módulo Perl es una pieza autónoma de código Perl que puede ser utilizado por un programa Perl o por otros módulos Perl. Es conceptualmente similar a una biblioteca de enlaces C o una clase C ++.
1
No importa. Puede ser2
, puede ser"foo"
, puede ser["a", "list"]
. Lo que importa es que no lo es0
, o cualquier otra cosa que se evalúe como falsa ouse
fallaría.