2010-08-04 16 views
76

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

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 del módulo Perl?

+10

'1' no importa. Puede ser '2', puede ser' "foo" ', puede ser' ["a", "list"] '. Lo que importa es que no es '0', o cualquier otra cosa que se evalúe como falsa, o' use' fallaría. – Amadan

+0

.pl es en realidad una biblioteca perl: los scripts Perl, como los programas C o los programas escritos en otros idiomas, no tienen final, excepto en los sistemas operativos que necesitan uno para funcionar, como Windows. –

Respuesta

-2

A .pl es una secuencia de comandos única.

En .pm (Perl Module) que tiene funciones que se pueden utilizar de otros scripts de Perl:

Un módulo de Perl es una pieza de código Perl autónomo 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++.

+4

"A .pl es un script único". No es verdad. Solo en sistemas operativos rotos es necesario identificar los programas Perl con la extensión .pl. Y originalmentepl indicó una "biblioteca de Perl": subrutinas externas que cargó con un comando "requerir" o "hacer". –

65

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 los archivos .pm siguiendo una cierta estructura de directorios que sigue el nombre del paquete proporciona una conveniencia. 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án lo correcto cuando se les dé 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 para poner fin a un archivo de este tipo con 1; a menos que esté seguro de que volverá cierto lo contrario. Pero es mejor simplemente poner el 1;, en caso de que agregue más declaraciones.

Si EXPR es una palabra clave, el require asume una extensión ".pm" y reemplaza "::" con "/" en el nombre de archivo para que sea 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 use hace es averiguar el nombre del archivo del nombre del paquete proporcionado, require en un bloque BEGIN e invocar import en el paquete. No hay nada que le impida no usar use, pero seguir esos pasos de forma manual.

Por ejemplo, a continuación puse el paquete Example::Plot::FourD en un archivo llamado t.pl, lo cargué en una secuencia de comandos 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 los módulos no tienen que terminar en 1, cualquier valor real va a hacer.

Cuestiones relacionadas