Perl - Pacotes e Módulos

O que são pacotes?

o packageinstrução muda o contexto de nomenclatura atual para um namespace especificado (tabela de símbolos). Assim -

  • Um pacote é uma coleção de código que reside em seu próprio namespace.

  • Um namespace é uma coleção nomeada de nomes de variáveis ​​exclusivos (também chamada de tabela de símbolos).

  • Os namespaces evitam colisões de nomes de variáveis ​​entre pacotes.

  • Os pacotes permitem a construção de módulos que, quando usados, não afetam variáveis ​​e funções fora do próprio namespace dos módulos.

  • O pacote permanece em vigor até que outra instrução de pacote seja chamada ou até o final do bloco ou arquivo atual.

  • Você pode referir-se explicitamente a variáveis ​​dentro de um pacote usando o :: qualificador de pacote.

A seguir está um exemplo com os pacotes principal e Foo em um arquivo. Aqui, a variável especial __PACKAGE__ foi usada para imprimir o nome do pacote.

#!/usr/bin/perl

# This is main package
$i = 1; 
print "Package name : " , __PACKAGE__ , " $i\n"; 

package Foo;
# This is Foo package
$i = 10; 
print "Package name : " , __PACKAGE__ , " $i\n"; 

package main;
# This is again main package
$i = 100; 
print "Package name : " , __PACKAGE__ , " $i\n"; 
print "Package name : " , __PACKAGE__ ,  " $Foo::i\n"; 

1;

Quando o código acima é executado, ele produz o seguinte resultado -

Package name : main 1
Package name : Foo 10
Package name : main 100
Package name : main 10

Blocos BEGIN e END

Você pode definir qualquer número de blocos de código chamados BEGIN e END, que atuam como construtores e destruidores, respectivamente.

BEGIN { ... }
END { ... }
BEGIN { ... }
END { ... }
  • Cada BEGIN bloco é executado após o script perl ser carregado e compilado, mas antes que qualquer outra instrução seja executada.

  • Cada bloco END é executado logo antes da saída do interpretador perl.

  • Os blocos BEGIN e END são particularmente úteis ao criar módulos Perl.

O exemplo a seguir mostra seu uso -

#!/usr/bin/perl

package Foo;
print "Begin and Block Demo\n";

BEGIN { 
   print "This is BEGIN Block\n" 
}

END { 
   print "This is END Block\n" 
}

1;

Quando o código acima é executado, ele produz o seguinte resultado -

This is BEGIN Block
Begin and Block Demo
This is END Block

O que são módulos Perl?

Um módulo Perl é um pacote reutilizável definido em um arquivo de biblioteca cujo nome é igual ao nome do pacote com uma extensão .pm.

Um arquivo de módulo Perl chamado Foo.pm pode conter declarações como esta.

#!/usr/bin/perl

package Foo;
sub bar { 
   print "Hello $_[0]\n" 
}

sub blat { 
   print "World $_[0]\n" 
}
1;

Alguns pontos importantes sobre os módulos Perl

  • As funções require e use irá carregar um módulo.

  • Ambos usam a lista de caminhos de pesquisa em @INC para encontrar o módulo.

  • Ambas as funções require e use Ligar para eval função para processar o código.

  • o 1; na parte inferior faz com que o eval seja avaliado como TRUE (e, portanto, não falhe).

A função necessária

Um módulo pode ser carregado chamando o require funcionar da seguinte forma -

#!/usr/bin/perl

require Foo;

Foo::bar( "a" );
Foo::blat( "b" );

Você deve ter notado que os nomes das sub-rotinas devem ser totalmente qualificados para chamá-los. Seria bom habilitar a sub-rotinabar e blat para ser importado em nosso próprio namespace, para que não tenhamos que usar o qualificador Foo ::.

A Função de Uso

Um módulo pode ser carregado chamando o use função.

#!/usr/bin/perl

use Foo;

bar( "a" );
blat( "b" );

Observe que não precisamos qualificar totalmente os nomes das funções do pacote. ouse A função exportará uma lista de símbolos de um módulo, dadas algumas instruções adicionadas dentro de um módulo.

require Exporter;
@ISA = qw(Exporter);

Em seguida, forneça uma lista de símbolos (escalares, listas, hashes, sub-rotinas, etc) preenchendo a variável da lista chamada @EXPORT: Por exemplo -

package Module;

require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(bar blat);

sub bar { print "Hello $_[0]\n" }
sub blat { print "World $_[0]\n" }
sub splat { print "Not $_[0]\n" }  # Not exported!

1;

Crie a árvore de módulos Perl

Quando você estiver pronto para enviar seu módulo Perl, haverá uma maneira padrão de criar uma Árvore de Módulos Perl. Isso é feito usandoh2xsUtilitário. Este utilitário vem junto com o Perl. Aqui está a sintaxe para usar h2xs -

$h2xs -AX -n  ModuleName

Por exemplo, se o seu módulo está disponível em Person.pm arquivo, então simplesmente emita o seguinte comando -

$h2xs -AX -n Person

Isso produzirá o seguinte resultado -

Writing Person/lib/Person.pm
Writing Person/Makefile.PL
Writing Person/README
Writing Person/t/Person.t
Writing Person/Changes
Writing Person/MANIFEST

Aqui está a descrição dessas opções -

  • -A omite o código do Autoloader (melhor usado por módulos que definem um grande número de sub-rotinas usadas com pouca frequência).

  • -X omite elementos XS (sub-rotina eXternal, onde eXternal significa externo ao Perl, ou seja, C).

  • -n especifica o nome do módulo.

Portanto, o comando acima cria a seguinte estrutura dentro do diretório Person. O resultado real é mostrado acima.

  • Changes
  • Makefile.PL
  • MANIFEST (contém a lista de todos os arquivos do pacote)
  • README
  • t / (arquivos de teste)
  • lib / (o código-fonte real vai aqui

Então finalmente, você taresta estrutura de diretório em um arquivo Person.tar.gz e você pode enviá-lo. Você terá que atualizar o arquivo README com as instruções adequadas. Você também pode fornecer alguns arquivos de exemplos de teste no diretório t.

Instalando Módulo Perl

Baixe um módulo Perl no arquivo tar.gz do formato. Use a seguinte sequência para instalar qualquer Módulo PerlPerson.pm que foi baixado como Person.tar.gz Arquivo.

tar xvfz Person.tar.gz
cd Person
perl Makefile.PL
make
make install

O interpretador Perl tem uma lista de diretórios nos quais procura por módulos (array global @INC).