Joenio CostaPublicado em 17/12/2008
r10 - 17 Dec 2008 - JoenioCosta
Perl já vem com muitos módulos pré-instalados -- os chamados módulos "core", ou "padrão". Esta é uma lista de módulos que vale a pena conhecer.
A lista de módulos "core" é imensa. Se você quiser uma lista completa, pode encontrá-la em:
perldoc perlmodlib
Estes módulos não precisam de instalação; são parte da distribuição padrão de Perl.
(Atenção: este é um tópico voltado para iniciantes -- portanto, vamos nos concentrar em módulos simples e genéricos, que podem ser usados em muitos tipos de programas -- e evitar módulos específicos ou esotéricos.)
Gera mensagens de erro sob o ponto de vista de quem chamou o módulo. Ao invés de gerar mensagens sob o ponto de vista do módulo, como faria o die ("File not found at My::Fancy::Module line 42" -- o que é verdadeiro, porém inútil), as rotinas de Carp geram mensagens sob o ponto de vista de quem chamou o método ("File not found at script.pl line 10").
Documentação perldoc
Descubra o diretório a partir do qual seu script foi chamado. (Veja também: FindBin, para descobrir o diretorio real do seu script)
Documentação perldoc
Converte estruturas de dados complexas para string que pode ser armazenada, impressa na tela (muito útil para depuração!), ou avaliada (eval) de volta para uma estrutura de dados.
Documentação perldoc
Faça conversões entre diferentes codificações de caracteres (utf8, latin1, etc). Por exemplo:
use Encode;
while ( my $line = <> ) {
Encode::from_to( $line, 'latin1', 'utf8' ); # converte de latin1 para utf8
print $line;
}
O código acima pode ser simplificado para o seguinte one-liner:
perl -MEncode -p -e 'Encode::from_to( $_, "latin1", "utf8" )' arquivo.txt
Use nomes de variáveis descritivos, ao invés de variáveis de pontuação ($INPUT_RECORD_SEPARATOR ao inves de $/ ; $EVAL_ERROR ao inves de $@ ;etc).
Obtenha um filehandle para um arquivo temporário -- com segurança.
Descubra o diretório original do seu script. (Veja também: Cwd, para descobrir o diretorio a partir do qual o seu script foi chamado)
Sistema flexivel para obter opções de linha de comando (-h, --help, etc). Veja também: Pod::Usage
Rotinas úteis para lidar com hashes (por exemplo: lock_keys/unlock_keys para tornar as chaves "estritas").
Rotinas úteis para lidar com arrays (por exemplo: first, max, min, shuffle, sum).
(Veja também: List::MoreUtils -- que não é um módulo core, mas um bom complemento para este módulo)
Implemente um cache para resultados de subrotinas. (Util para acelerar funcoes que dependem somente dos valores de seus argumentos)
Permita que o seu código seja extendido por plugins. Por exemplo, imagine que você tem um módulo chamado Email::Examiner, e deseja que ele possa ser extendido por plugins:
package Email::Examiner;
use strict;
use Email::Simple;
use Module::Pluggable require => 1;
sub handle_email {
my $self = shift;
my $email = shift;
foreach my $plugin ($self->plugins) { # Para cada plugin encontrado...
$plugin->examine($email);
}
return 1;
}
Isso é tudo o que você precisa fazer -- o módulo procurará por um sub-diretório "Plugin", e todos os módulos dentro de "Email/Examiner/Plugin/*" terão a chance de examinar o conteúdo de $email.
Exiba uma mensagem de uso a partir da documentação pod. (Util para apresentar a opcao --help, em conjunto com Getopt::Long
use Pod::Usage;
use Getopt::Long;
## Define options
my %options = ();
my @opt_specs = (
'help',
'man',
'foo=s',
'bar=s',
);
## Parse options
GetOptions(\%options, @opt_specs) || pod2usage(2);
pod2usage(1) if $options{help};
pod2usage(VERBOSE => 2) if $options{man};
Rotinas úteis para lidar com variáveis escalares. (Veja também: List::Util e Hash::Util)
A infraestrutura para testes automatizados em Perl. Altamente recomendado!
Manipule um arquivo como se fosse um array. (Use shift() para ler a primeira linha, pop() para ler a ultima, etc).
Se você quer que o seu programa "adormeca" por alguns segundos, é muito fácil:
sleep(1); # 1 segundo
Infelizmente, a funcão sleep()
padrão não
aceita intervalos fracionários.
O módulo Time::HiRes permite criar timers de alta resolução, isto é, intervalos menores do que 1 segundo:
use Time::HiRes qw( sleep );
sleep (0.5);
Além disso, o Time::HiRes é útil para descobrir quanto tempo seu programa levou para executar uma determinada tarefa:
my $t0 = [gettimeofday];
# seu código aqui
my $interval = tv_interval ( $t0 );
print "Tempo de execucao: $interval segundos\n";
Joenio Costa