Qual é a diferença entre .pm
(módulo Perl) e .pl
(script Perl) arquivo?
Diga-me também por que voltamos 1
do arquivo. Se retornar 2 ou qualquer outra coisa, não está gerando nenhum erro, então por que retornamos 1
do módulo Perl?
Qual é a diferença entre .pm
(módulo Perl) e .pl
(script Perl) arquivo?
Diga-me também por que voltamos 1
do arquivo. Se retornar 2 ou qualquer outra coisa, não está gerando nenhum erro, então por que retornamos 1
do módulo Perl?
Respostas:
Basicamente, a extensão de arquivo que você usa não faz diferença em como perl
interpreta esses arquivos.
No entanto, colocar módulos em .pm
arquivos que seguem uma certa estrutura de diretório que segue o nome do pacote é uma conveniência. Portanto, se você tiver um módulo Example::Plot::FourD
e colocá-lo em um diretório Example/Plot/FourD.pm
em um caminho no seu @INC
, use
e require
fará a coisa certa quando receber o nome do pacote como em use Example::Plot::FourD
.
O arquivo deve retornar true como a última instrução para indicar a execução bem-sucedida de qualquer código de inicialização, portanto, é comum encerrar esse arquivo com a
1;
menos que você tenha certeza de que retornará true de outra forma. Mas é melhor apenas colocar o1;
, caso adicione mais instruções.Se
EXPR
for uma palavra de barra,require
assume a extensão ".pm" e substitui "::" por "/" no nome do arquivo para você, para facilitar o carregamento dos módulos padrão. Esta forma de carregamento de módulos não corre o risco de alterar seu namespace.
Tudo o que use
faz é descobrir o nome do arquivo a partir do nome do pacote fornecido, require
em um BEGIN
bloco e invocar import
no pacote. Não há nada que o impeça de não usar, use
mas executar essas etapas manualmente.
Por exemplo, abaixo coloquei o Example::Plot::FourD
pacote em um arquivo chamado t.pl
, carreguei-o em um script em arquivo 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 exemplo mostra que os arquivos de módulo não precisam terminar em 1
, qualquer valor verdadeiro servirá.
Um .pl é um único script.
Em .pm ( Módulo Perl ), você tem funções que pode usar de outros scripts Perl:
Um módulo Perl é uma parte independente do código Perl que pode ser usado por um programa Perl ou por outros módulos Perl. É conceitualmente semelhante a uma biblioteca de links C ou a uma classe C ++.
1
não importa. Pode ser2
, pode ser"foo"
, pode ser["a", "list"]
. O que importa é que não seja0
, ou qualquer outra coisa que seja avaliada como falsa ouuse
que falhe.