En Perl, ¿cuál es la diferencia entre un archivo .pm (módulo Perl) y .pl (script Perl)?

88

¿Cuál es la diferencia entre .pm(módulo Perl) y .plarchivo (script Perl)?

Por favor, dígame también por qué regresamos 1del archivo. Si devuelve 2 o cualquier otra cosa, no genera ningún error, entonces, ¿por qué regresamos 1del módulo Perl?

user380979
fuente
11
1No importa. Puede ser 2, puede ser "foo", puede ser ["a", "list"]. Lo que importa es que no lo es 0, o cualquier otra cosa que se evalúe como falsa o usefallaría.
Amadan
.pl es en realidad una biblioteca de Perl: los scripts de Perl, como los programas en C o los programas escritos en otros lenguajes, no tienen terminación, excepto en los sistemas operativos que necesitan una para funcionar, como Windows.
Recuerda a Monica

Respuestas:

78

En esencia, la extensión de archivo que use no hace ninguna diferencia en cuanto a cómo perlinterpretar esos archivos.

Sin embargo, colocar módulos en .pmarchivos siguiendo una determinada estructura de directorio que sigue al nombre del paquete proporciona una comodidad. Entonces, si tiene un módulo Example::Plot::FourDy lo coloca en un directorio Example/Plot/FourD.pmen una ruta en su @INC, entonces usey requirehará 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 el 1;, en caso de que agregue más declaraciones.

Si EXPRes una palabra básica, requireasume 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 usehace es averiguar el nombre del archivo a partir del nombre del paquete proporcionado, requirecolocarlo en un BEGINbloque e invocarlo importen el paquete. No hay nada que le impida no usar, usesino tomar esos pasos manualmente.

Por ejemplo, a continuación puse el Example::Plot::FourDpaquete 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á.

Sinan Ünür
fuente
-2

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 ++.

Igor Oks
fuente
5
"Un .pl es un único script". No es verdad. Es solo en los sistemas operativos defectuosos que necesita identificar los programas Perl con una extensión .pl. Y originalmente .pl indicaba una "biblioteca Perl": subrutinas externas que cargó con un comando "requerir" o "hacer".
Dave Cross