Em Perl, qual é a diferença entre um arquivo .pm (módulo Perl) e um arquivo .pl (script Perl)?

88

Qual é a diferença entre .pm(módulo Perl) e .pl(script Perl) arquivo?

Diga-me também por que voltamos 1do arquivo. Se retornar 2 ou qualquer outra coisa, não está gerando nenhum erro, então por que retornamos 1do módulo Perl?

user380979
fonte
11
1não importa. Pode ser 2, pode ser "foo", pode ser ["a", "list"]. O que importa é que não seja 0, ou qualquer outra coisa que seja avaliada como falsa ou useque falhe.
Amadan
.pl é na verdade uma biblioteca perl - scripts perl, como programas C ou programas escritos em outras linguagens, não têm uma terminação, exceto em sistemas operacionais que precisam de uma para funcionar, como o Windows.
Lembre

Respostas:

78

Basicamente, a extensão de arquivo que você usa não faz diferença em como perlinterpreta esses arquivos.

No entanto, colocar módulos em .pmarquivos 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::FourDe colocá-lo em um diretório Example/Plot/FourD.pmem um caminho no seu @INC, usee requirefará 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 o 1;, caso adicione mais instruções.

Se EXPRfor uma palavra de barra, requireassume 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 usefaz é descobrir o nome do arquivo a partir do nome do pacote fornecido, requireem um BEGINbloco e invocar importno pacote. Não há nada que o impeça de não usar, usemas executar essas etapas manualmente.

Por exemplo, abaixo coloquei o Example::Plot::FourDpacote 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á.

Sinan Ünür
fonte
-2

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

Igor Oks
fonte
5
"A .pl é um único script." Não é verdade. É apenas em sistemas operacionais corrompidos que você precisa identificar programas Perl com uma extensão .pl. E originalmente .pl indicava uma "biblioteca Perl" - sub-rotinas externas que você carregou com um comando "require" ou "do".
Dave Cross,