Perl – Subrotina e Módulo

Uma função, método ou subrotina é um grupo de declarações que juntas executam uma tarefa específica. Podem estar dentro de um programa ou dentro de um módulo.

Um módulo é um conjunto ou uma coleção de subrotinas e variáveis relacionadas em um arquivo de biblioteca. É projetado especificamente para ser reutilizável por outros módulos ou programas.

  • Design-time I

O programa mudaNome1.pl localizado em \wsl.localhost\Ubuntu\home\lcmoura\Documentos\perl_files\subroutine contém uma subrotina.

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

my $nome;

print "Insira o nome: ";
chomp($nome = <>);

print "Oi, ". $nome . "!\n";

print "Novo nome: ". &pessoa . "\n";

sub pessoa{
	$nome = $nome . ' de Tal';
}
  • Design-time II

O programa mudaNome2.pl localizado em \wsl.localhost\Ubuntu\home\lcmoura\Documentos\perl_files\subroutine utiliza uma subrotina externa, situada no módulo Mensagem.pm.

#!/usr/bin/perl
use warnings;
use strict;
use modules::Mensagem;

my $nome;

print "Insira o nome: ";
chomp($nome = <>);

print "Oi, ". $nome . "!\n";

$Mensagem::username = $nome;

print "Novo nome: ". Mensagem::pessoa() . "\n";

O módulo Mensagem.pm localizado em \wsl.localhost\Ubuntu\home\lcmoura\Documentos\perl_files\modules contém a subrotina utilizada pelo programa mudaNome2.pl.

package Mensagem;

$username;

sub pessoa{
	$username = $username . ' de Tal';
}

1;
  • Runtime

  • Sintaxe

No primeiro design, a subrotina pessoa foi chamada com a instrução no formato &nome_da_subrotina na linha 12, embora o formato nome_da_subrotina() seja melhor mesmo não havendo argumentos (que seriam colocados entre os parênteses). Esta opção foi usada no segundo design com o formato nome_do_módulo :: nome_da_subrotina() ilustrado na linha 15.

Para rodar o programa do segundo design, mudaNome2.pl, é necessário antes indicar o caminho ou localização da pasta que contém o(s) módulo(s) com a seguinte instrução no shell:

export PERL5LIB=path

Neste caso, para a pasta modules path=/home/lcmoura/Documentos/perl_files.

Observe que o nome do módulo deve ter o seguinte formato: nome_do_módulo.pm e o módulo deve conter a instrução

package nome_do_módulo; (ver linha 1 do módulo)

e ser finalizada com a instrução

1; (ver linha 9 do módulo). Este é o valor de retorno do módulo, e que poderia ser qualquer outro valor verdadeiro em Perl.

Dúvidas?

  • Reflexão

Em Psicologia, o termo florescer equivale ao processo de se tornar o melhor de si, que envolve emoções positivas, engajamento, relacionamentos, significado e realização. Que tal fazer o seguinte teste da escala florescente

Seguem oito afirmações com as quais você pode concordar ou discordar. Usando a seguinte escala de 1 a 7, forneça uma resposta para cada afirmação. 

7 – Concordo plenamente 

6 – Concordo 

5 – Concordo um pouco 

4 – Nem concordo nem discordo 

3 – Discordo um pouco 

2 – Discordo 

1 – Discordo totalmente 

___ Eu levo uma vida com propósito e significado. 

___ Meus relacionamentos sociais são favoráveis e gratificantes. 

___ Estou engajado e interessado em minhas atividades diárias. 

___ Contribuo ativamente para a felicidade e o bem-estar dos outros. 

___ Sou competente e capaz nas atividades que são importantes para mim. 

___ Sou uma boa pessoa e vivo uma boa vida. 

___ Estou otimista em relação ao meu futuro. 

___ As pessoas me respeitam. 

Pontuação: 

Some as respostas, variando de 1 a 7, para todos os oito itens. O intervalo possível de pontuações é de 8 (o mais baixo possível) a 56 (o mais alto possível). Uma pontuação alta indica uma pessoa com muitos recursos e pontos fortes psicológicos. 

Perl – Referências

Uma referência é uma variável escalar que aponta ou se refere a outro objeto que pode ser um escalar, um array, um hash. Uma referência contém um endereço de memória do objeto para o qual ela aponta. Quando uma referência é desreferenciada, você pode manipular os dados do objeto ao qual a referência se refere. O ato de recuperar dados por meio de uma referência é chamado de desreferenciação.

As definições acima parecem um pouco complicadas. E são. Por isso, vamos começar através da construção de uma tabela usando um hash de hashes e um hash de arrays.

Design & Runtime

  • Hash de hashes
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my (%ahash, $akey, $avalue, $i);
print "Informe chaves (ex.: aluno, país) e valores (ex: nota, cidade):\n";
while(1){
		print "Chave: ";
		chomp($akey = <>);
		last if $akey eq "";
		$i = 1;
		while(1){
			print "Valor: ";
			chomp($avalue = <>);
			last if $avalue eq "";
			$ahash{$akey}{"valor$i"} = $avalue;
			$i++;
		}
}
print Dumper \%ahash;

  • Hash de arrays
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my (%ahash, $akey, $avalue);
print "Informe chaves (ex.: aluno, país) e valores (ex: nota, cidade):\n";
while(1){
		print "Chave: ";
		chomp($akey = <>);
		last if $akey eq "";
		while(1){
			print "Valor: ";
			chomp($avalue = <>);
			last if $avalue eq "";
			push @{$ahash{$akey}}, $avalue;
		}
} 
print Dumper \%ahash;

Sintaxe

No primeiro código e exemplo nós temos uma referência para um hash, cujas chaves são nomes de alunos e cujos valores são hashes. Estes hashes têm chaves denominadas valorN (onde N=1, 2 e 3) e valores que correspondem às notas dos alunos.

No segundo código e exemplo nós temos uma referência para um hash, cujas chaves são nomes de alunos e cujos valores são arrays. Estes arrays têm elementos que correspondem às notas dos alunos.

O segundo código é idêntico ao primeiro, exceto por não utilizar a variável contadora $i e colocar os valores do hash em arrays através da função push.

Em Perl não há diretamente valores booleanos true e false. Valores diferentes de 0, ‘0’ (string contendo o algarismo zero) e ” (string vazia) são considerados como true, Observe a condição nos laços while – linhas 7 e 12 no primeiro código, e 7 e 11 no segundo.

A grande novidade nestes exemplos está na linha 16 do primeiro código e na linha 15 do segundo código. Que tal entrarmos em detalhes nos próximos posts?

Reflexões

Ao me questionar sobre por que gosto de aprender e especialmente aprender o que é difícil para a maioria, deparei-me com esse artigo muito interessante: The Hard Thing About Learning Hard Things ou, usando o Google Tradutor, o lado difícil de aprender coisas difíceis.

Sobre a atitude e a escolha de aprender ou não, é realmente impressionante o fato de ser extremamente comum que muitas pessoas permaneçam estúpidas justamente porque preferem não parecer estúpidas.