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)