A Aldeia Numaboa ancestral ainda está disponível para visitação. É a versão mais antiga da Aldeia que eu não quis simplesmente descartar depois de mais de 10 milhões de pageviews. Como diz a Sirley, nossa cozinheira e filósofa de plantão: "Misericórdia, ai que dó!"

Se você tiver curiosidade, o endereço é numaboa.net.br.

Leia mais...

Informática Numaboa - Tutoriais e Programação

Linguagem Perl - Variáveis

Qui

20

Nov

2008


14:04

(3 votos, média 5.00 de 5) 


Existem vários tipos e modos de referência a variáveis na linguagem Perl. Neste tutorial tentei destrinchar ao máximo o assunto.

Variáveis Simples (Escalares)

Variáveis são áreas de armazenamento nas quais podem ser guardados dados que serão utilizados durante a execução de um programa. O conteúdo de uma variável é denominado de "valor". Os valores de variáveis podem ser alterados a qualquer tempo.

Em Perl, uma variável simples, que contenha um número ou uma sequência de caracteres, é denominada de variável escalar. Exemplos:

$Nome_1 = "Matusalém"; $Idade_1 = 625; $Nome_2 = "Pedro Bó"; $Idade_2 = sqrt($Idade);

Um pequeno script Perl usando variáveis escalares:

#!/usr/bin/perl $Valor = 123456; $Valorzinho = substr($Valor,1,3); print $Valorzinho;

Uma escalar, ou seja, uma variável simples, é composta por um cifrão $ seguido do nome da variável. O cifrão sempre precisa estar presente se a variável for utilizada para receber um valor ou numa operação (como no exemplo acima, onde a variável $Idade aparece dentro da função sqrt() que calcula a raiz quadrada de um número).

Você pode definir escalares para conteúdo numérico ou para sequências de caracteres (strings). O tipo de conteúdo é decidido no momento em que se atribui o valor da escalar ou no momento em que ela é utilizada numa diretiva. Se o valor atribuído for uma sequência de caracteres, estes precisam estar entre aspas, simples ('caracteres') ou duplas ("caracteres"). Para maiores detalhes, veja Convenções para Sequência de Caracteres.

info Observações: Os dados em Perl não são "tipados". Quando se tem uma sequência de caracteres constituída apenas por caracteres numéricos (ex. "7423.13"), pode-se efetuar cálculos numéricos com a mesma, sem nenhum problema. Da mesma maneira, pode-se tratar valores numéricos como uma sequência de caracteres. Para observar esta característica, verifique o pequeno script acima. Definiu-se $Valor como uma escalar numérica. Logo abaixo, utilizamos uma função típica para tratamento de strings, a substr(). Os parâmetros desta função significam: extrair, a partir do segundo caracter, três caracteres (o segundo caracter é solicitado através do parâmetro 1 porque em Perl, assim como na maioria das outras linguagens de programação, começa-se a contar a partir do zero). O resultado obtido, "234", é armazenado na escalar $Valorzinho. Caso você já programe em outra linguagem, então você poderá avaliar o grau de liberdade que a linguagem Perl oferece no tratamento de variáveis.

Matrizes (Arrays)

Matrizes são seqüências de grupos de escalares. Em Perl, as matrizes têm uma importância primordial porque oferecem um modo muito fácil de armazenar dados e de manipulá-los. Exemplo 1:

#!/usr/bin/perl @Dados = ("Maria",23,"Curitiba","3o.Grau"); print $Dados[0], " tem ", $Dados[1], " anos, mora em ", $Dados[2], " e tem ", $Dados[3];

Exemplo 2:

#!/usr/bin/perl for($i = 1;$i <= 9;$i++) { $Valor = $i * $i; push(@Quadrados, $Valor); } for(@Quadrados) { print $_, "\n"; }

Exemplo 3:

#!/usr/bin/perl @Letra = ("a".."z"); print $Letra[2], "\n";

Em Perl, uma matriz é iniciada por um sinal de arroba @ seguido do nome da matriz. É possível inicializar uma matriz com valores predefinidos, como a matriz @Dados do exemplo 1. Note que os dados precisam estar entre parênteses e separados por vírgulas.

As matrizes também podem ser geradas dinamicamente, como se pode observar no exemplo 2: dentro de um loop, que conta de 1 até 9, a matriz @Quadrados é povoada dinamicamente com os quadrados dos números de 1 atá 9. Isto é possível graças ao uso da função push(), a qual adiciona elementos no final da matriz.

O exemplo 3 mostra uma variação especial. Para se povoar uma matriz com letras (de-até) ou com números (de-até) basta indicar o primeiro e o último caractere desejado, separados por dois pontos (no exemplo, a matriz @Letra é povoada com caracteres minúsculos de a até z).

Quando os valores de uma matriz são predefinidos, valem as mesmas regras das variáveis escalares: strings são indicadas entre aspas, valores numéricos não precisam de aspas. É claro que também é possível povoar uma matriz com escalares. Neste caso, a lista incorpora o valor das escalares correspondentes.

Para se referir a um determinado elemento de uma matriz, utiliza-se o nome da matriz precedido do sinal de cifrão $ (da mesma forma que nas escalares). Após o nome, segue o número do elemento da lista entre colchetes. O primeiro elemento é identificado por @NomeDaLista[0], o segundo por @NomeDaLista[1] e assim sucessivamente. No primeiro exemplo, logo acima, esta característica fica bem clara.

Ainda com referência aos 3 exemplos citados, seguem os dados das matrizes criadas e seus respectivos elementos.

@Dados $Dados[0] $Dados[1] $Dados[2] $Dados[3]
Maria 23 Curitiba 3o. Grau

@Quadrados
$Quadrados[0] 1
$Quadrados[1] 4
$Quadrados[2] 9
... ...
$Quadrados[7] 64
$Quadrados[8] 81
@Letras
$Letra[0] a
$Letra[1] b
$Letra[2] c
... ...
$Letra[24] y
$Letra[25] z

É muito simples atribuir o valor de um elemento de uma matriz a uma variável escalar. Basta a seguinte linha de comando: $Nome = $Dados[0];

Também é muito simples copiar uma matriz completa para outra matriz. Basta o comando: @NovaLista = @Quadrados;

Pode-se armazenar strings e valores numéricos numa mesma matriz, como no exemplo 1 acima. Também não existe limitação do número de elementos numa matriz. Pode-se, portanto, armazenar uma matriz inteira como elemento de uma outra matriz, ou seja, uma matriz B dentro de um elemento da matriz A. Um elemento da matriz "embutida" B pode, então, ser obtido através de @MAtrizA[2][4] (isto é, o terceiro elemento da matriz A é a matriz B e, desta, solicita-se o quinto elemento).

Mesmo sem uma definição prévia, pode-se atribuir um valor a uma matriz. Por exemplo, $Numeros[5] = 4321; cria a matriz @Numeros com seis elementos, $Numeros[0] a $Numeros[5]. Os primeiros 5 elementos estão vazios e o sexto elemento recebe o valor 4321.

O último elemento de uma matriz pode sempre ser acessado através de @NomeDaMatriz[-1]. O índice negativo -1 está reservado para tal fim.


Matrizes Associativas (Hash)

Matrizes comuns são constituídas por uma seqüência de valores que podem ser obtidos através do seu número de índice, que sempre começa com 0. Assim, o 8º elemento de uma matriz de nome @NomeDaMatriz pode ser obtido através de $NomeDaMAtriz[7].

Uma matriz associativa, denominada de Hash na linguagem PERL, guarda em cada elemento da lista duas coisas: um nome e um valor. Os valores da matriz, neste caso, não precisam ser acessados através do seu número de índice. Podem ser obtidos diretamente através do nome a eles associados. Exemplo:

#!/usr/bin/perl %Dados = ("Nome", "Joana", "Idade", 23, "Grau", "Superior"); print $Dados{'Nome'}, " tem ", $Dados{'Idade'}, " anos de idade e grau ", $Dados{'Grau'};

Um hash é inicializado em PERL através do sinal de porcento %. Quando se cria um hash com dados, estes sempre são definidos em pares: o primeiro representa o nome do hash, o segundo corresponde ao valor que será obtido quando se utiliza o nome do hash. Assim, no exemplo acima, os primeiros dois elementos, "Nome" e "Joana", constituem o primeiro par hash do Hash %Dados.

Para acessar um determinado elemento dentro de um hash, utiliza-se o nome da variável hash precedida de um cifrão $, da mesma forma como em variáveis escalares simples. Após o nome da variável hash, utiliza-se um par de colchetes, dentro dos quais fica o nome do elemento hash desejado entre aspas simples. No exemplo acima obtém-se com $Dados{'Nome'} o valor correspondente a "Joana".

info Observação: Os Hashes, ou seja, as matrizes associativas, têm as mesmas regras e características que as matrizes comuns.

Os hashes são muito úteis num script CGI. É possível, por exemplo, utilizá-los para armazenar parâmetros enviados por um formulário dando ao nome hash o nome dos campos do formulário e, ao valor hash, o valor atribuído pelo usuário aos mesmos campos do formulário.

Referências (Ponteiros de Variáveis)

Quem conhece a linguagem C (assim como outras), sabe o que são ponteiros e como a programação pode se tornar eficiente com o seu uso. Referências são ponteiros para tipos de dados previamente definidos (tanto faz se escalares, matrizes ou hashes). Através de referências é possível obter o conteúdo de uma variável escalar, de uma matriz ou de um hash da mesma forma que com o uso do nome original.

O interessante à respeito das referências em Perl é que o valor de uma variável é mantido enquanto existirem referências a essa variável. Isto é muito importante quando se trabalha com sub-rotinas, nas quais sejam definidos tipos de dados locais válidos. Exemplo:

#!/usr/bin/perl &A(); sub B() { print $$ReferenciaTexto, "\n"; # O valor existe apenas na referência! } sub A() { my $Texto = "Isto é um pequeno texto"; $ReferenciaTexto = \$Texto; # Aqui é definida a referência &B(); }

O exemplo acima esclarece com funciona uma referência. O pequeno script Perl do exemplo contém duas subrotinas definidas como A() e B(). Inicialmente, com &A(), é chamada a subrotina A(). Nesta subrotina, a escalar $Texto, cuja sobrevida está restrita à subrotina A(), é definida através do uso de my (minha).

Logo após definir a escalar, a referência é definida. A referência é definida da mesma forma que uma escalar normal. Na atribuição do valor da referência utiliza-se uma barra invertida \. A barra invertida faz com que, ao invés da referência $ReferenciaTexto receber o mesmo valor de $Texto, ela receba o endereço onde se encontra o valor de $Texto. É por esse motivo que a referência ocupa muito menos memória que a escalar.

Por último, a subrotina B() é chamada na área da subrotina A(). Na subrotina B(), o valor da referência $ReferenciaTexto é apresentado através da função print. Se, neste ponto, a diretiva fosse print $Texto;, nada seria mostrado porque a variável $Texto da subrotina A(), com seu respectivo valor, a essa altura já foi descartada. O valor sozinho, porém, ainda existe e pode ser alcançado através da referência $ReferenciaTexto.

Para se obter o valor de uma referência através de uma escalar é necessário associar dois sinais de cifrão $$ ao nome da referência, como mostrado no exemplo acima.

info Observação: Se, por exemplo, uma diretiva print se referir diretamente a uma referência ao invés de se referir ao seu valor, o endereço de memória onde se encontra o valor é mostrado na sua forma hexadecimal.

As referências podem ser definidas não só para escalares, como também matrizes e hashes; até mesmo para elementos de matrizes e hashs. A tabela a seguir dá uma idéia de como devem ser as notações:

Referência Definição Buscar valor Alternativa
de Escalar $Ref = \$Escalar $$Ref ${$Ref}
de Matriz $Ref = \@Lista @$Ref @{$Ref}
de Elemento de Matriz $Ref = \@Matriz @{$Ref}[0] $Ref->[0]
de Hash $Ref = \%Hash %$Ref %{$Ref}
de Elemento de Hash $Ref = \%Hash %{$Ref}{"Nome"} $Ref->{"Nome"}
Вадим Логофет отецкерамические кастрюли купитьростов никас харьков центр духовныйwobs.uaооо компания полигон полигон

Informações adicionais