$ @ % – O que isso significa?!

February 4, 2009 · Posted in Perl 

Antes de qualquer coisa, gostaria de agradecer ao Blabos o convite e a introdução tão exagerada:)

Bom, mas eu estou aqui pra falar de perl, então vamos começar.

Variáveis, como o nome diz, elas são usadas para armazenar valores variáveis. Em perl existem 3 tipos básicos de variáveis (preste atenção, eu disse básicos). Esses são:

  • Scalar
  • Array
  • Hash

Elas servem p/ armazenar valores. Cada um desses “tipos” são representados com um símbolo. Quando você se refere a um valor escalar, você deve usar o símbolo “$“, para array “@” e para hash “%“.

Vamos ver isso na prática:

Escalares

Para criar uma variável scalar chamada “var_scalar“, basta você usá-la:

$var_scalar;

Bem simples, não?! Agora, e como eu ponho um valor dentro dessa variável? Ainda mais fácil:

$var_scalar = 0;

Nada mais lógico, certo? Só de você usar essa variável, o perl já a cria p/ você… Legal né?! Então é assim que eu seto um valor numérico para uma variável scalar em perl, mas e se eu quiser usar uma string? Bom, p/ isso basta:

$var_scalar = "String setada dentro da variável";

Sim, você entendeu certo! Você não precisa dizer se vai ser número ou texto! Para o perl é “indiferente”!

Isso tá muito fácil, né?! Vamos passar para o próximo caso, Array.

Arrays

O símbolo para array é o “@“. Então como seria um nome válido para um array? Que tal esse?

@var_array;

Isso! Mas o que exatamente é um array? Array ‘uma variável que contém uma lista de valores. Por exemplo:

@array_numerico = (1, 2, 3, 4, 5);
@array_de_strings = ("lalala", "lelele", "lilili", "lololo", "lululu");
@array_misturado = (1, "lalala", 2, "lelele", 3, "lilili", 4);

Bom… Mas no caso do primeiro, o @array_numerico, se eu quisesse popular o array com os números de 1 a 100, eu teria que escrever os numeros de um a um? Não, existe forma mais fácil:

@array_numerico = (1 ... 100);

Bem simples de entender, e bem menor que escrever os números de 1 a 100…

Bom, já entendemos como setar um array inteiro de uma única vez… Mas e se eu quiser criar valor por valor?! É possível? Claro!

$meu_array[0] = "Posição 0...";
$meu_array[1] = "Posição 1...";
$meu_array[2] = "Posição 2...";
$meu_array[3] = "Posição 3...";
$meu_array[4] = "Posição 4...";

Pera aí que eu agora me confundi!!! Você não disse que o símbolo do array era o “@“?! Porque vc tá usando “$“?!

Bem, os colchetes (“[]“) indicam que estamos procurando uma posição de um array, e dentro dessa posição nada mais temos que um valor escalar! Por isso usamos o “$“. Caso estivessemos usando mais de uma posição do array (uma lista de valores), usariamos o “@“.

@meu_array[0, 2, 4] = ("Posição 0...", "Posição 2...", "Posição 4...");

Isso sim, agora estamos tratando de uma lista de valores, logo usamos o “@“…

Array – Conjunto de Funções

Arrays em perl tem um conjunto de funções bem especificas pra eles, vamos ver algumas:

  • push
  • shift
  • pop
  • unshift
  • splice

Vamos do começo, o push inclui um (ou mais) valor(es) num array, por exemplo:

push @array_exemplo, "posição 0"; # agora o array contém "posição 0".
push @array_exemplo, 1, 2, 3; # agora é ("posição 0", 1, 2, 3)
push @array_exemplo, "pos 4"; # e agora ("posição 0", 1, 2, 3, "pos 4")

Entendeu?

O shift remove e retorna o primeiro elemento do array, vamos ver como ele funciona:

shift @array_exemplo; # o array agora tem (1, 2, 3, "pos 4")
$meu_scalar = shift @array_exemplo; # array:(2, 3, "pos 4"), scalar: 1
$meu_scalar = shift @array_exemplo; # array:(3, "pos 4"), scalar: 2

Certo? O pop remove, e retorna o último elemento o array, e o unshift incui um ou mais elementos no inicio do array.

A sintaxe do splice é a seginte:

splice @array, $posicao, $quantidade, "lista", "de", "elementos";

Bom, vamos ver alguns exemplos:

@array = (1 ... 10); # (1 ,2, 3, 4, 5, 6, 7, 8, 9, 10)
splice @array, 5, 2; # (1, 2, 3, 4, 5, 8, 9, 10)
# Eu não passei uma lista p/ botar no lugar, então
# ele foi na posição 5 do array (no valor 6) e subs-
# tituiu os 2 elementos apartir daquela posição (5 e 6)
# pelos elementos da lista (nada)
splice @array, 2, 1, "lalala", "lelele";
# (1, 2, "lalala", "lelele", 4, 5, 8, 9, 10)
# ele foi na posição 2, e substituiu 1 elemento apartir
# dessa posição pelos elementos da lista ("lalala", "lelele")
splice @array, 6, 0, "teste";
# (1, 2, "lalala", "lelele", 4, 5, "teste", 8, 9, 10)
# vai na posição 6, subistitua nenhum elemento pela lista

Além dessas funções, os arrays tem algumas outras coisas interessantes…

@array = (1 ... 5);
print scalar @array, "\n"; # imprime 5
print $#array, "\n"; # imprime 4

Como assim?! scalar?! isso é uma variável?! mas tá sem o “$“!!! $#array?! o que significa isso?!

Calma… eu explico! Não, o scalar não é uma variável, o scalar muda o contexto da expressão p/ contexto scalar (como o nome diz…) e um array num contexto scalar retorna o numero de elementos desse. No caso, o array contendo 1 … 5 quer dizer que ele contem 5 elementos. E o $#array? Bom, todo array que você cria, cria essa “variável”. Se o nome do seu array é @array, a variável vai ser $#array, se o nome é @lista, vai ser $#lista e se for @estou_sem_criatividade_pra_inventar_nome_de_array, ela será $#estou_sem_criatividade_pra_inventar_nome_de_array. E o que isso faz? Isso retorna a última posição do array. Se um array tem 5 elementos, e os indices começam de 0, logo a última posição do array será 4.

Hashs

Basta de array! Vamos ver os hashs. O símbolo p/ hash é o “%“. Hash é uma lista de valores, que diferente dos arrays não são indexados por números, mas sim por nomes, e não são ordenados.

%hash_exemplo;
%meu_hash = ("Janeiro" => 1, "Fevereiro" => 2, "Março" => 3);

O %meu_hash possui 3 posições, a posição “Janeiro“, a “Fevereiro” e a “Março“. A posição “Janeiro” contém o valor 1, a “Fevereiro” contém 2 e a “Março” contém 3.

Se você quiser escrever posição por posição, você também pode:

$meu_hash{"Abril"} = 4;
$meu_hash{"Maio"} = 5;
$meu_hash{"Junho"} = 6;
$meu_hash{"Julho"} = 7;

As chaves (“{}“) indicam que é uma posição de hash, e o “$” indica que essa posição é um valor escalar.

Hashs – Funções

Os Hashs também tem funções interessantes:

  • keys
  • values
  • delete

O keys retorna todas as chaves (nome de posições) do hash:

@chaves = keys %meu_hash; # @chaves contem ("Janeiro", "Fevereiro",
# "Março", "Abril", "Maio", "Junho", "Julho")

O values retorna o valor de todas as posições:

@valores = values %meu_hash; # @valores contém (1, 2, 3, 4, 5, 6, 7)

E o delete apaga uma posição do hash e retorna o valor daquela posição:

$maio = delete $meu_hash{"Maio"}; # o hash não tem mais  posição maio
# e $maio contem 5.

Bom, é melhor eu ir parando por aqui… Acho que acabei me empolgando e isso ficou muito grande…

Obrigado pela leitura. Se isso tiver muito fácil p/ você, talvez fosse interessante uma olhada no perl-e.org, onde o material é para os programadores avançados.

Ficou interessado? quer saber mais?

Mais uma vez Blabos, obrigado pelo espaço, e até a próxima!

Comments

  • http://blabos.org blabos

    Muito bom o texto. Parabéns!

  • http://perl-e.org SmokeMachine

    Obrigado

  • http://br-linux.org/2009/mini-tutorial-sobre-perl/ Mini Tutorial sobre Perl

    [...] por Blabos de Blebe (blabosΘblabos·org) – referência [...]

  • garu

    Parabéns! Muito bem explicado, ótima introdução a variáveis em Perl

  • Sicka

    Uia! Achei que fosse palavrão =P

    Brincadeiras à parte, gostei muito do seu texto. Aguardo o próximo.

  • Mago

    Achei isso confuso:

    %meu_hash = (“Janeiro” => 1, “Fevereiro” => 2, “Março” => 3);

    Acho que os melhores exemplos seriam:

    %meu_hash = ( ‘Janeiro’ => 28,
    ‘Fevereiro’ => 35,
    ‘Março’ => 29,);

    %meu_hash = (“Janeiro”, 1, “Fevereiro”, 2, “Março”, 3);

  • http://estilotabi.blogspot.com tairone

    O que é Pearl?

    Ela cria programas para Linux?

  • http://blabos.org blabos

    Perl e não ‘Pearl’ é uma linguagem de programação (você pode criar programas com ela) multiplataforma (roda em linux também).

    Cuidado para não confundir com a linguagem Pearl, que é outra linguagem de programação, as não tem nada a ver com o Perl do post.

    Dê uma olhadinha nos links no final do post ;)

    Abraços

  • http://perl-e.org SmokeMachine

    Talvez fosse interessante vc dar uma lida aqui: http://rio.pm.org/faq.pl

  • http://blog.blabos.org/2009/02/escrevendo-na-tela/ Escrevendo na tela : Blog do Blabos de Blebe

    [...] das aspas duplas, ele diz que o que está por vir é uma variável escalar (como já vimos no post passado) então se usarmos a barra invertida () antes desse caracter, ele perde toda a especialidade dele, [...]

  • Júnio

    Muito obrigado pela contribuição, está sendo de grande valia. Paz e saúde para ti!

blog comments powered by Disqus