Joenio Costa

Módulos básicos que você precisa conhecer
Publicado em 17/12/2008

r10 - 17 Dec 2008 - JoenioCosta

Módulos básicos que você precisa conhecer

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

Carp

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

Cwd

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

Data::Dumper

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

Encode

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

English

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

File::Temp

Obtenha um filehandle para um arquivo temporário -- com segurança.

FindBin

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)

Getopt::Long

Sistema flexivel para obter opções de linha de comando (-h, --help, etc). Veja também: Pod::Usage

Hash::Util

Rotinas úteis para lidar com hashes (por exemplo: lock_keys/unlock_keys para tornar as chaves "estritas").

List::Util

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)

Memoize

Implemente um cache para resultados de subrotinas. (Util para acelerar funcoes que dependem somente dos valores de seus argumentos)

Module::Pluggable

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.

Pod::Usage

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};

Scalar::Util

Rotinas úteis para lidar com variáveis escalares. (Veja também: List::Util e Hash::Util)

Test::More

A infraestrutura para testes automatizados em Perl. Altamente recomendado!

Tie::File

Manipule um arquivo como se fosse um array. (Use shift() para ler a primeira linha, pop() para ler a ultima, etc).

Time::HiRes

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";

AUTHOR

Joenio Costa

blog comments powered by Disqus