Escrevendo Módulos PERL

O que são pacotes?

  • Um pacote é uma coleção de código que vive 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

A Declaração do Pacote

  • instrução pacote muda o contexto de nomenclatura atual para um namespace especificado (tabela de símbolos)

  • Se o pacote nomeado não existir, um novo namespace será criado primeiro.

$i = 1; print "$i\n"; # Prints "1"
package foo;
$i = 2; print "$i\n"; # Prints "2"
package main;
print "$i\n"; # Prints "1"
  • 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

$PACKAGE_NAME::VARIABLE_NAME

For Example:
$i = 1; print "$i\n"; # Prints "1"
package foo;
$i = 2; print "$i\n"; # Prints "2"
package main;
print "$i\n"; # Prints "1"

print "$foo::i\n"; # Prints "2"

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 de qualquer outra instrução ser 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 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 um .pm no final).

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

#!/usr/bin/perl

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

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

Alguns pontos notáveis ​​sobre os módulos

  • 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 (você pode modificá-lo!)

  • Ambos chamam o 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 função

#!/usr/bin/perl

require Foo;

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

Observe acima que os nomes das sub-rotinas devem ser totalmente qualificados (porque estão isolados em seu próprio pacote)

Seria bom habilitar as funções bar e blat para serem importadas em nosso próprio namespace para que não precisássemos 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?

A função use irá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, existe uma maneira padrão de criar uma Árvore de Módulos Perl. Isso é feito usandoh2xsUtilitário. Este utilitário vem junto com PERL. Aqui está a sintaxe para usar h2xs

$h2xs -AX -n  Module Name

# For example, if your module is available in Person.pm file
$h2xs -AX -n Person

This will produce following result
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 e você pode enviá-lo. Você teria que atualizar o arquivo README com as instruções adequadas. Você pode fornecer alguns arquivos de exemplos de teste no diretório t.

Instalando Módulo Perl

Instalar um módulo Perl é muito fácil. Use a seguinte sequência para instalar qualquer Módulo Perl.

perl Makefile.PL
make
make install

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