Separando seu código em módulos no Perl

Publicado por Daniel Vinciguerra (última atualização em 31/03/2016)

[ Hits: 3.459 ]

Homepage: http://bivee.com.br

Download module.pl




Hoje vamos ver como separar nosso código para que a gente possa agrupar vários métodos comuns em um mesmo módulo, facilitando assim a manutenção, refatoração e reaproveitamento dos códigos dos nossos scripts.

O MÓDULO

  - Módulos, assim como as classes no Perl, são nomeados através de package (namespace)
  - Os módulos Perl podem ter a API no estilo procedural ou orientada a objetos
  - metacpan.org/pod/Exporter permite que seus subs seja chamados sem a necessidade de usar o namespace

O módulo que veremos abaixo serve apenas como introdução e é diferente dos módulos que são publicados no CPAN (cpan.org) por diversas questões técnicas. Meu intuito aqui foi introduzir o leitor ao reaproveitamento dos seus códigos e ao princípio de uso de módulos para tornar seu trabalho mais profissional, organizado e para gerar curiosidade sobre a colaboração de códigos em Perl.

Você pode construir módulos com qualquer finalidade, porém quando estiver desenvolvendo em Perl, dê uma passadinha no CPAN e procure pelo modulo que você esta precisando para saber se ninguém já implementou algo parecido e que atenda as suas necessidades.

PRÉ-REQUISITOS

- perl 5.10 ou superior


REFERÊNCIAS

http://perldoc.perl.org/perlmodstyle.html
https://en.wikipedia.org/wiki/Perl_module


EXECUTANDO

$ perl module.pl

  



Esconder código-fonte

#!/usr/bin/env perl 
use 5.10.0;
use strict;
use warnings;

# Módulo Calculo
# este modulo pode ser extraido deste arquivo e colocado em um outro arquivo. 
# Ex de Arquivo: Calculo.pm
# OBS.: lembre-se de colocar o 1; na ultima linha do arquivo exportado.
package Calculo {
  
  sub somar {
    my ($n1, $n2) = @_;
    return $n1 + $n2;
  }

  sub subtrair {
    my ($n1, $n2) = @_;
    return $n1 - $n2;
  }

  sub multiplicar {
    my ($n1, $n2) = @_;
    return $n1 * $n2;
  }

  sub dividir {
    my ($n1, $n2) = @_;
    return sprintf "%2.2f", $n1 / $n2;
  }
}


# Calculo.pm exportado para outro diretório use:
# use lib 'path/to/lib/';

# Calculo.pm exportado para o mesmo diretório do script use:
# use Calculo;


# OBS.: Lembrando que classes e modulos declarados no mesmo arquivo
# que o script que irá rodar não precisam ser importados com 'use'. 


# dados os numeros...
my ($n1, $n2) = (14, 22);


# Chamando a operação de soma do modulo
print_stdout('Soma', Calculo::somar($n1, $n2) ); 


# Chamando a operação de subtrair do modulo
print_stdout('Subtracao', Calculo::subtrair($n1, $n2) ); 


# Chamando a operação de multiplicar do modulo
print_stdout('Subtracao', Calculo::multiplicar($n1, $n2) ); 


# Chamando a operação de dividir do modulo
print_stdout('Subtracao', Calculo::dividir($n1, $n2) ); 



sub print_stdout {
  my ($op, $result) = @_;
  say "\nOperacao: ${op}";
  say "Calculo entre os numeros ${n1} e ${n2} = ${result}";
}

Scripts recomendados

Perl OO & Atributos com Class::Accessor

Exemplo de uso do módulo Term::InKey

Calculo de valor futuro - regrassão linear

Usando sub/method signatures no Perl

Listar arquivos de um diretório.


  

Comentários
[1] Comentário enviado por removido em 31/03/2016 - 19:05h

Uma coisa de que nunca fui atrás: existe tratamento de erro em Perl? Como no caso de divisão por zero?

----------------------------------------------------------------------------------------------------------------
# apt-get purge systemd (não é prá digitar isso!)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden

[2] Comentário enviado por dvinciguerra em 31/03/2016 - 19:27h

Existe sim e de várias formas...

As formas mais encontradas é utilizando o bloco de código eval {} ou o módulo mais utilizado Try::Tiny para prover uma forma mais simples e intuitiva de tratar a exceção:

# Nativo
my $result = 0;

# try
eval {
$result = 10 / 0;
};
# catch
if(my $ex = $@) {
warn "Divisão por zero encontrada"
if $ex =~ /Illegal division by zero/;
}

# Modulo
use Try::Tiny;

try {
$result = 10 / 0;
}
catch {
warn "Divisão por zero encontrada"
if /Illegal division by zero/;
};

Grande abraço,

[3] Comentário enviado por removido em 31/03/2016 - 19:39h

Valeu!

----------------------------------------------------------------------------------------------------------------
# apt-get purge systemd (não é prá digitar isso!)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden

[4] Comentário enviado por robnos em 25/10/2017 - 10:52h

Não consegui separar por módulo, apresenta erro que não localiza o modulo, alguém conseguiu fazer o procedimento e poderia ajudar ?

[5] Comentário enviado por dvinciguerra em 28/10/2017 - 13:46h


[4] Comentário enviado por robnos em 25/10/2017 - 10:52h

Não consegui separar por módulo, apresenta erro que não localiza o modulo, alguém conseguiu fazer o procedimento e poderia ajudar ?


Boa tarde robnos,
Como você esta fazendo? Posso te dar uma força?


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts