Você está na página 1de 10

Primeiros Passos em Perl

Este um pequeno tutorial de Perl, destinado a quem nao tem experiencia em programacao.

Escrevendo coisas na tela


Inicie o seu editor de textos favorito, e digite o seguinte programa. Salve-o como "print.pl":
print "Ol, mundo!!!";

O programa realmente simples: utiliza o comando print para imprimir um texto na tela
do computador.

Execute o programa
Voc pode executar o script invocando o interpretador perl manualmente:
perl print.pl

Voc dever ver a mensagem na tela.


Experimente agora digitar o seguinte programa (print2.pl):
print "Ol,
mundo!!!";

Execute o programa (perl print2.pl) e veja o resultado.


Como voc pode ver, a linguagem Perl bastante flexvel, e se voc digitar ENTER no
meio de uma linha de texto, o interpretador saber exatamente o que fazer.
(Um dos lemas da linguagem Perl There's More Than One Way To Do It, ou seja, existe
mais de uma maneira de se fazer o que voc deseja.)
Este terceiro programa faz a mesma coisa:
print "Ol,\nmundo!!!";

O smbolo \n indica uma quebra de linha, o equivalente a digitar enter. Sempre que voc
quiser imprimir um texto em mais de uma linha, pode utilizar o smbolo \n.

Conversando com o usurio


No tpico anterior ns vimos como imprimir coisas na tela, utilizando o comando print.

Na maioria das vezes, porm, seu programa precisar interagir com o usurio.
Neste tpico ns veremos quais so os comandos em Perl que podem ser usados para ler o
teclado, e como guardar as informaes na memria.
Antes de mais nada, digite o seguinte programa e salve-o como "nome.pl":
print "Digite o seu nome: ";
my $nome = <>;
print "Ol, $nome!!!";

Se o programa no contiver erros, a mensagem "Digite o seu nome:" ser impressa na tela,
com o cursor piscando ao lado.
A execuo interrompida na segunda linha, que faz o programa esperar que o usurio
digite algo pelo teclado. Quem faz isso o <>, conhecido em Perl como "operador
diamante", que l uma linha digitada pelo usurio. (Na verdade, o operador diamante faz
muito mais do que isso, como ns veremos adiante.)
Quando o usurio pressiona ENTER, a informao digitada associada varivel $nome, e
pode ento ser usada no resto do programa.
A essa altura voc pode estar se perguntando: por que a varivel $nome comea com um
cifro?

Variveis Escalares
Antes de responder essa pergunta, digite mais esse programa:
print "Digite um numero: ";
my $x = <>;
chomp $x;
print "$x vezes 2 igual a ", ($x * 2), "\n";
print "Agora digite uma palavra: ";
$x = <>;
chomp $x;
print "A palavra '$x'!!!";

Este programa mostra que a mesma varivel, $x, pode conter letras ou nmeros.
Chamamos de variveis de "escalares", aquelas que podem estar associadas a um valor
qualquer, numrico ou alfanumrico.
Isto significa que variveis escalares podem ser usadas para armazenar nmeros (e com eles
fazer contas) ou letras (tambm conhecidos como strings).

Evitando erros

Imagine que, ao digitar o programa nome.pl, voc cometeu um erro de digitao:


print "Digite o seu nome: ";
my $nome = <>;
print "Ol, $name!!!";

Voc consegue enxergar o erro?


A varivel onde guardamos o nome chama-se "$nome". Mas quando vamos imprimir seu
valor, digitamos, por engano "$name".
E quando voc executar o programa, ele no vai funcionar -- sem que voc saiba porqu.
Felizmente perl pode te ajudar a encontrar estes erros automaticamente. Para isso, voc s
precisa incluir a seguinte linha no incio do seu programa:
use strict;

A diretiva use strict muito importante, e voc deve us-la sempre, em todos os seus
programas.
Quando perl encontra essa instruo, passa a exigir que todas as variveis sejam declaradas;
caso contrrio ele apontar um erro. E isso muito importante, pois, de outra forma, o erro
de digitao se propagaria de maneira silenciosa.
Por isso, importante repetir: use strict em todos os seus programas, sempre!

Voltas e mais voltas


No tpico anterior, vimos como ler uma informao digitada pelo usurio, atravs da
entrada padro.
Agora ns vamos ver que a entrada padro tambm pode ser usada para ler a resposta de
outros programas.
Em primeiro lugar, porm, precisamos ver como realizar repeties em Perl.

Lao "foreach"
Digite o seguinte programa e salve-o como "foreach.pl":
use strict;
for my $i (1..10) {
print "$i\n";
}

Ao execut-lo voc dever obter o seguinte resultado:


1
2
3
4
5
6
7
8
9
10

O que aconteceu?
O comando for (ou foreach) comum em muitas linguagens de programao. Ele
simplesmente efetua um determinado nmero de repeties, colocando os valores numa
varivel ($i).
claro que existem maneiras diferente de obter o mesmo resultado. Voc pode omitir a
varivel $i:
for (1..10) {
print "$_\n";
}

Opa! De onde surgiu essa varivel "$_"???


A varivel $_ a chamada "varivel padro", que surge magicamente dentro de um loop,
quando no especificamos uma varivel.
Voc tambm pode inverter a ordem da expresso:
print "$_\n" for (1..10);

Listas
No tpico anterior, ns vimos que variveis escalares podem armazenar qualquer valor,
nmerico ou alfanumrico. Mas, e se quisermos armazenar uma lista de valores?
Uma possibilidade seria utilizar diversas variveis escalares:
my
my
my
my

$nome1
$nome2
$nome3
$nome4

=
=
=
=

"Kepler";
"Newton";
"Gauss";
"Maxwell";

print "$nome1\n";
print "$nome2\n";
print "$nome3\n";

print "$nome4\n";

Mas existe uma maneira mais inteligente, utilizando listas (ou arrays, em ingls).
Digite o seguinte programa:
use strict;
@nomes = ("Kepler","Newton","Gauss","Maxwell");
print "$_\n" for @nomes;

Assim como as variveis escalares comeam com $, as listas comeam sempre com @.
E, da mesma forma como nas variveis escalares, uma lista pode misturar itens numricos e
alfanumricos:
@lista = ("palavra", "007", 42);

Digite agora o seguinte programa, e salve-o como "csv.pl":


use strict;
@lista = <>;
print join (",",@lista);

Ao execut-lo, o programa ficar esperando que voc digite alguma coisa. Digite uma
palavra e pressione ENTER. Nada aconteceu?
Na verdade o programa ficar esperando que voc digite vrias palavras, para coloc-las em
uma lista (a varivel @lista). Digite mais algumas palavras e pressione Ctrl+D para
indicar o trmino. A lista de palavras ser impressa, s que separada por vrgulas.
Isto feito pelo comando join, que serve para unir os itens de uma lista utilizando um
determinado separador. Neste exemplo, os itens so separados por uma vrgula (",").
Mas por que tivemos que digitar Ctrl+D?
Como a varivel @lista esperava uma lista de itens separados por ENTER, o Ctrl+D foi
usado para indicar quando a lista termina. No Linux, ns podemos gerar um sinal de fim de
arquivo (tambm conhecido como "EOF", ou end of file) atravs da combinao Ctrl+D.
(No MS-DOS e no Windows, voc usaria Ctrl+Z.)
Isto s necessrio quando digitamos uma lista manualmente. Felizmente, na maioria das
vezes as listas sero "digitadas" automaticamente. A sada de um programa pode ser usada
como entrada de outro. Por exemplo:
$ ls | perl csv.pl

Neste exemplo, o comando ls simplesmente lista o contedo de um diretrio, que


redirecionado para o nosso programa. Assim, temos uma lista de arquivos separados por
vrgula!
Veja mais este exemplo:
$ ls | sort -r | perl csv.pl

Dessa vez ns encadeamos trs comandos: o ls lista os arquivos, o sort -r coloca-os em


ordem reversa, e o nosso script imprime a lista separada por vgulas.
Esta uma importante lio da "filosofia Unix":

Escreva programas que faam


apenas uma coisa mas que faam
bem feito.

Escreva programas que trabalhem


juntos.

Escreva programas que manipulem


texto, pois esta uma interface
universal.

No prximo tpico veremos como um programa pode modificar seu rumo de acordo com
certas condies.

Decises
A maioria dos programas no vai simplesmente repetir os dados que foram digitados pelo
usurio. Muitas vezes necessrio fazer algumas comparaes e, dependendo dos
resultados, tomar algumas decises.
O comando if faz uma comparao e, dependendo do resultado, executa uma sequncia de
comandos. Ele funciona mais ou menos assim:
se (expresso verdadeira) {
execute uma srie de comandos
}

Um exemplo simples, em Perl:


if ($idade < 18) {
die "Este programa proibido para menores de 18 anos!";
}

# o programa continua...

O comando if no apenas pode executar uma srie de comandos quando uma expresso for
verdadeira, mas tambm quando a expresso for falsa. Para isso, usamos a expresso else
("caso contrrio", em ingls):
if ($saldo > 0) {
print "Saldo positivo!";
} else {
print "Saldo negativo!";
}

Tipos de comparao
Como voc deve se lembrar, em Perl no existem diferenas entre variveis numricas e
alfanumricas: as mesmas variveis podem armazenar letras e nmeros.
E se ns quisermos comparar, por exemplo, $a=7 com $b="007"? As duas variveis tm
ou no tm o mesmo valor?
A resposta : depende. Se compararmos literalmente, $a e $b so diferentes; se
compararmos numericamente, so iguais.
Por isso, existe a distino entre comparaes numricas e literais em Perl. Quando
estivermos trabalhando com nmeros, utilizaremos as comparaes numricas, e quando
estivermos trabalhando com strings, utilizaremos as comparaes literais:
# Comparaes numricas
if ($idade == 18) { ... }
if ($idade > 100) { ... }
# Comparaes literais
if ($resposta eq "s") { ... }
if ($nome ne "Larry") { ... }

Uma questo de estilo


Assim como na Lngua Portuguesa, a linguagem Perl permite inverter a ordem de uma
frase.
Veja o seguinte exemplo:
# Confirma
print "Voc deseja continuar? (s/n) ";
my $resposta = getc();
die "O programa termina aqui.\n" if $resposta ne "s";

print "Vamos continuar...";

Mas lembre-se: apenas por que voc pode fazer algo, no significa que deva fazer isto
sempre. Por exemplo:
print "Saldo positivo!" if $saldo > 0;
print "Saldo negativo!" if $saldo < 0;

Como voc pode ver, o cdigo ficou repetitivo. Assim como em qualquer linguagem
natural, a redundncia deve ser evitada.
Apenas para concluir, vamos ver uma outra forma de se escrever uma condio, sem
utilizar if, else ou unless:
print "Saldo ", $saldo < 0 ? "negativo" : "positivo";

Com o tempo voc aprender a usar todos estes recursos da linguagem Perl...

Hashes
Nos tpicos anteriores, ns vimos dois tipos de variveis de Perl:

Escalares - ex: $valor = 123;

Arrays - ex: @lista = ('a', 'b', 'c');

O ltimo tipo de varivel o "hash".


Um hash semelhante a um dicionrio: para cada item (ou "chave"), temos um valor
correspondente.
Digite o seguinte programa:
use strict;
my %birthday = (
"Johannes Kepler"
"Isaac Newton"
"Carl Friedrich Gauss"
"James Clerk Maxwell"
);

=>
=>
=>
=>

"27/12/1571",
"25/12/1642",
"30/04/1777",
"13/06/1831"

foreach (sort keys %birthday) {


print "$_ nasceu em $birthday{$_}.\n";
}

Ao executar este programa, voc ver a resposta:


Carl Friedrich Gauss nasceu em 30/04/1777.

Isaac Newton nasceu em 25/12/1642.


James Clerk Maxwell nasceu em 13/06/1831.
Johannes Kepler nasceu em 27/12/1571.

O hash %birthday guarda chaves e valores de acordo com a seguinte estrutura:


Chave
Carl Friedrich Gauss
Isaac Newton
James Clerk Maxwell
Johannes Kepler

Valor
30/04/1777
25/12/1642
13/06/1831
27/12/1571

Para se referir a um nico item, basta utilizar a sintaxe $hash{key}, como por exemplo:
print $birthday{"Isaac Newton"};

Dentro do lao foreach, a varivel $_ guarda cada um dos nomes, e $birthday{$_}, a data
de nascimento.

Expressoes Regulares
Expresses regulares so expresses usadas para analisar e manipular textos.
Em sua forma mais simples, uma expresso regular pode ser usada para verificar se um
texto contm uma determinada letra, palavra, ou padro.

Manipulando arquivos
Existem inmeras formas de se ler arquivos em Perl.
Se voc estiver escrevendo um script simples, para realizar uma tarefa rpida, pode utilizar
o operador diamante (<>). Digite o programa a seguir, e salve-o com o nome de
"diamond.pl":
while ( <> ) {
print uc($_);
}

Experimente executar o programa, passando um arquivo-texto:


perl diamond.pl texto.txt

Se voc no tiver um arquivo texto, pode usar o prprio arquivo do programa:


perl diamond.pl diamond.pl

O que aconteceu? O programa percorreu cada uma das linhas do arquivo, e imprimiu a
linha em maisculas usando o comando uc.