Back-End

29 mai, 2008

Resgatando o Perl

Publicidade

PERL é uma linguagem de programação muito rica em tipos de dados e maneiras como eles podem ser reunidos para resolver um problema em especial. Este artigo busca mostrar, de forma concisa e direta, sem deixar de ser completa, os três tipos básicos: escalar, vetor (também chamado de array) e o hash (também chamado vetor associativo) e como eles são tratados internamente dentro de um programa, sempre tomando como base o meu conhecimento atual em PERL.

O tipo elementar é o chamado escalar. Ele poderia ser definido como a informação que pode ser armazenada numa única posição de memória. Seria equivalente aos tipos primitivos em JAVA, por exemplo. No que toca ao armazenamento, ele pode guardar números (inteiros ou ponto-flutuante), caracteres ou cadeias de caracteres, e referência para outras estruturas (essa última parte, por ser mais complexa, será deixada para um artigo em separado). Sua representação seria:


$variavel = 10;
$x = ´X´;
$teste_valor = "Marcelo...";

Nos três casos acima, foram definidas três variáveis, que fica claro pois cada uma delas recebe o sinal de “$” em seu início, seguindo da atribuição de algum valor, respectivamente, um inteiro, um caracter e uma string. Repare que não foi preciso definir o tipo de cada um antes de usá-las, pois PERL segue a linha da tipagem fraca, onde o tipo da variável é definida em tempo de execução e ainda, ela pode mudar dependendo do contexto. Cada uma delas só pode armazenar uma informação, o que faz com que o valor original seja perdido, caso uma nova atribuição seja feita.

Isso nos remete ao segundo tipo de dado, o vetor. Da mesma forma que em outras linguagens de programação, ele diz respeito a uma variável que engloba um conjunto de valores sob o mesmo nome, permitindo que um determinado valor seja acessado ao se informar o índice desejado. Em exemplos:

@nomes = (´Marcelo´, ´Maria´, ´Joao´);
$nomes[3] = ´Fabio´;
for($i = 0; $i < $#nomes; ++$i) {
  print $nomes[$i];
}

O símbolo “@” define uma variável do tipo vetor e que pode ser inicializado com os valores passados numa lista separados por vírgula. Repare que na linha seguinte um novo elemento foi inserido na posição seguinte (o índice começa na posição zero) e que a atribuição foi feita indicando o índice de destino e colocando-se um “$” na frente. Isso pode gerar confusão, mas deve-se atentar para o fato de que no caso, não se estava acessando a todo o vetor, mas a uma única posição, o que faz com que o contexto de uso seja o de um escalar e não o de um vetor.

Na repetição utilizada para percorrer todo o vetor imprimindo seu conteúdo, foi usada a notação $# que retorna o último índice do vetor, indicando seu final. Como dica, fica que esse mesmo comando de repetição poderia ser substituído por uma chamada da função join(), com muito menos código e muito mais legibilidade.

Por fim, a estrutura que eu considero mais poderosa na linguagem, o hash. Ele se aproxima bastante do comportamento dos vetores, com exceção que na sua chave pode ser utilizado qualquer tipo de estrutura, além de que ele foi implementado e evoluído para que fosse eficiente, permitindo buscas de elementos nele em tempo linear, desde que conhecida a chave.

%contas = ();
$contas{"Marcelo"} = 10;
$contas{"Joao"} = 100;
$contas{"Maria"} = -20;

foreach my $correntista (keys %contas) {
  print $correntista . " possui: R$" . $contas{$correntista};
}

No exemplo, foi criado um hash inicialmente vazio. A ele, foram adicionados três valores, que podem ser acessados através das chaves criadas para cada um deles. A qualquer momento de posse da chave, pode-se ter acesso a todos os valores por ela referenciados. O exemplo é simples, onde o valor atribuído é um escalar, mas em seu lugar poderia ser colocado qualquer nível de hash mais específicos.

Repare que no momento em que o dado é atribuído a alguma posição da estrutura, é utilizado o símbolo “$“, pois novamente temos que pensar que está sendo acessado uma posição escalar no momento. O laço percorre a estrutura recebendo como argumento as chaves retornadas pela função keys (note que agora sim, é usado o símbolo “%” para acessar alguma informação diretamente relacionada ao hash.