Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Tutorial Perl
http://Tutorial.VirtualAve.net
11/03/99
UM PROGRAMA SIMPLES
A PRIMEIRA LINHA
COMENTRIOS E DECLARAES
IMPRIMINDO NA TELA
3
3
3
EXECUTANDO O PROGRAMA
VARIVEIS ESCALARES
OPERAES E ATRIBUIES
INTERPOLAO
EXERCCIO
5
6
6
VARIVEIS DE MATRIZES
ATRIBUIES DE MATRIZES
MOSTRANDO MATRIZES
EXERCCIO
7
8
8
MANIPULANDO ARQUIVOS
EXERCCIO
10
ESTRUTURAS DE CONTROLE
11
Tutorial On-Line
Tutorial Perl
11
11
12
12
13
FOREACH
TESTANDO
FOR
WHILE E UNTIL
EXERCCIO
CONDICIONAIS
14
EXERCCIO
14
COMPARANDO STRINGS
15
EXPRESSES REGULARES
A VARIVEL ESPECIAL $_
MAIS SOBRE ERS
ALGUNS EXEMPLOS DE ERS
EXERCCIO
15
15
16
18
18
SUBSTITUIO E TRADUO
19
OPES
RECORDANDO MODELOS
TRADUO
EXERCCIO
19
20
21
22
SPLIT
23
EXERCCIO
24
MATRIZES ASSOCIATIVAS
25
OPERADORES
VARIVEIS DE AMBIENTE
26
26
SUBROTINAS
27
PARMETROS
RETORNANDO VALORES
VARIVEIS LOCAIS
27
28
28
_________________________________________________________________
Um programa simples
Tutorial On-Line
Tutorial Perl
1.
A primeira linha
Todo programa escrito em Perl deve sempre comear com esta linha:
#!/usr/local/bin/perl
Contudo, ela pode variar de sistema para sistema. Esta linha indica
para o servidor o que fazer com o arquivo quando ele executado (i.,
rodar o programa atravs do Perl) e informa a localizao exata do
compilador.
_________________________________________________________________
2.
Comentrios e declaraes
3.
Imprimindo na tela
Tutorial On-Line
Tutorial Perl
Executando o programa
Digite o programa acima em um editor de texto, depois salve ele.
Existem duas formas de instalar seu programa no servidor:
Pelo Unix (requer conhecimento bsico), Emacs um bom editor porque
possui o modo Perl que formata linhas facilmente quando voc pressiona
tab (use M-x perl-mode).
Pelo FTP, use qualquer editor de texto puro, e envie o arquivo atravs
de um programa de FTP (CuteFTP ou WS_FTP), importante que seja usado o
modo de transferncia ASCII, e nunca Binrio.
O programa deve ser salvo com a extenso .cgi (que indica ser um
script) ou com .pl (de Perl), e depois torn-lo executvel.
Pelo Unix, digite:
chmod u+x programa
na linha de comandos, onde programa o nome do seu arquivo.
Pelo FTP, clique em alterar atributos do arquivo, escolhendo o valor
755 (-rwxr-xr-x).
Agora rode o programa apenas digitando um destes comandos:
perl programa (pelo DOS ou UNIX)
./programa
(pelo UNIX)
programa
(pelo UNIX)
Caso voc esteja usando a linha de comandos do DOS, necessrio ter o
programa Perl for Win32 instalado, ele pode ser retirado no endereo:
http://www.activestate.com/
Se algo ocorrer de errado, podem aparecer mensagens de erro, ou nada.
Voc pode sempre rodar o programa com mensagens atravs do comando:
perl -w programa
Ele mostrar avisos e outras mensagens de ajuda antes de tentar
executar o programa. Para rod-lo com a depurao, use o comando:
perl -d programa
O Perl compila primeiro o programa e ento executa sua verso
compilada. Assim, aps uma pequena pausa para compilao, o programa deve
rodar rapidamente.
Certifique-se de que o programa est funcionando antes de continuar.
Veremos a seguir como tornar esse programa mais interessante.
_________________________________________________________________
Tutorial On-Line
Tutorial Perl
Variveis escalares
O tipo mais usado de varivel no Perl o escalar. Variveis escalares
podem conter caracteres e/ou nmeros, e note que eles so completamente
intercambiveis. Por exemplo, a declarao:
$prioridade = 9;
atribui a varivel escalar $prioridade o valor 9, mas voc pode tambm
designar uma string (cadeia de caracteres) para a mesma varivel:
$prioridade = 'alta';
Perl tambm aceita nmeros como strings:
$prioridade = '9';
$default = '0009';
e ainda pode realizar operaes aritmticas ou outras.
Em geral, nomes de variveis consistem de nmeros, letras e smbolos _
mas no devem comear com nmeros depois do $. A varivel $_ especial,
como veremos mais tarde. Alm disso, o Perl case sensitive, i., letras
maisculas so diferentes de minsculas, por exemplo, $a e $A so
variveis distintas.
_________________________________________________________________
4.
Operaes e Atribuies
O Perl utiliza todas as operaes usuais na linguagem C:
$a = 1
$a = 3
$a = 5
$a = 7
$a = 9
$a = 5
++$a;
$a++;
--$a;
$a--;
+ 2;
- 4;
* 6;
/ 8;
** 10;
% 2;
#
#
#
#
#
#
#
#
#
#
soma 1 e 2 e armazena em $a
subtrai 4 de 3 e armazena em $a
multiplica 5 por 6
divide 7 por 8 e retorna 0.875
9 elevado por 10
resto da diviso de 5 por 2
incrementa $a e retorna seu valor
retorna $a e depois incrementa em 1
decrementa $a e retorna seu valor
retorna $a e depois decrementa em 1
# concatena $b e $c
# $b repetido $c vezes
# atribui $b para $a
Tutorial On-Line
$a += $b;
$a -= $b;
$a .= $b;
Tutorial Perl
# soma $b para $a
# subtrai $b de $a
# acrescenta $b em $a
Note que quando Perl atribui um valor como $a = $b, ele faz uma cpia
de $b e ento o atribui para $a. Portanto, na prxima vez que voc
alterar $b, ele no ir alterar $a.
Outras operaes podem ser encontradas atravs do comando man perlop
na linha de comandos do Unix.
_________________________________________________________________
5.
Interpolao
O seguinte cdigo mostra mas e pras usando concatenao:
$a = 'mas';
$b = 'pras';
print $a.' e '.$b;
Seria mais fcil incluir somente uma string no final da declarao
print, mas a linha:
print '$a e $b';
mostra somente $a e $b, e no mas e pras, o que no o nosso caso.
Ao invs disso, podemos usar aspas duplas no lugar de aspas simples:
print "$a e $b";
Estas aspas foram a interpolao de qualquer cdigo, incluindo
interpretao de variveis. Isso mais apropriado que nossa declarao
original. Outros cdigos que so interpolados incluem caracteres como
newline e tab. O cdigo \n o newline (enter/return) e \t o tab.
Outros exemplos que produzem o mesmo resultado:
print ' Meu e-mail nome@dominio.com '."\n";
print " Meu e-mail nome\@dominio.com \n";
# concatenao necessria
Note que, com aspas duplas, se faz necessrio o uso da barra invertida
antes do @, porque seno ele ser interpretado como sendo uma varivel,
que veremos adiante.
_________________________________________________________________
6.
Exerccio
Neste exerccio voc deve reescrever seu primeiro programa de modo que
(1) a string seja atribuda para uma varivel e (2) esta varivel seja
impressa com um caractere newline. Use as aspas duplas e no utilize o
operador de concatenao.
Tutorial On-Line
Tutorial Perl
Variveis de matrizes
Um tipo mais interessante de varivel o de matrizes (vetores) que
uma lista de variveis escalares. Variveis de matrizes tem o mesmo
formato das escalares exceto que eles so prefixados pelo smbolo @. As
declaraes:
@comida = ("mas", "pras", "uvas");
@musica = ("flauta", "gaita");
atribuem trs elementos para a matriz @comida e dois para a matriz
@musica.
A matriz acessada pelo uso de ndices comeando do zero, e colchetes
so usados para especificar cada ndice. A expresso:
$comida[2]
retorna uvas. Note que o smbolo @ foi mudado para $ porque uvas o
valor de uma varivel escalar.
_________________________________________________________________
7.
Atribuies de matrizes
Tutorial On-Line
Tutorial Perl
#
#
#
($a, @alguma_comida) = @comida; #
#
#
(@alguma_comida, $a) = @comida; #
#
8.
Mostrando matrizes
Tutorial On-Line
9.
Tutorial Perl
Exerccio
Experimente cada uma das trs declaraes acima para ver o que elas
fazem.
_________________________________________________________________
Manipulando arquivos
Aqui est um programa bsico em Perl que faz o mesmo que o comando cat
do Unix em um certo arquivo:
#!/usr/local/bin/perl
#
# Programa para abrir o arquivo de senhas, ler,
# escrever, e fech-lo.
$arquivo = '/etc/passwd';
open(INFO, $arquivo);
@linhas = <INFO>;
close(INFO);
print @linhas;
#
#
#
#
#
nome do arquivo
abre o arquivo
coloca ele em uma matriz
fecha o arquivo
exibe a matriz
$arquivo);
">$arquivo");
">>$arquivo");
"<$arquivo");
#
#
#
#
Tutorial On-Line
Tutorial Perl
10.
Exerccio
10
Tutorial On-Line
Tutorial Perl
_________________________________________________________________
Estruturas de controle
Possibilidades mais interessantes aparecem quando ns introduzimos as
estruturas de controle e o looping. Perl suporta muitos tipos diferentes
de estruturas de controle que tendem a ser como na linguagem C, mas
muitos so similares aos do Pascal, tambm. Aqui discutiremos um pouco
delas.
_________________________________________________________________
11.
foreach
{
print "$petisco\n";
print "Yum yum\n";
}
As aes a serem realizadas cada vez, esto no bloco entre chaves. Na
primeira passagem pelo bloco, $petisco atribudo ao valor do primeiro
item da matriz @comida. Na prxima vez, ele atribudo ao segundo valor,
e assim por diante. Se @comida estiver vazio logo no incio, ento o
bloco de declaraes no ser executado.
_________________________________________________________________
12.
Testando
Tutorial On-Line
$a == $b
Tutorial Perl
#
#
#
#
#
$a != $b
$a eq $b
$a ne $b
# $a e $b so verdadeiros?
# $a ou $b verdadeiro?
# $a falso?
_________________________________________________________________
13.
for
Perl possui a estrutura for que funciona da mesma forma que no C. Ele
tem o formato:
for (inicializar; testar; incrementar)
{
primeira_ao;
segunda_ao;
etc;
}
Primeiramente, a declarao inicializar executada. Ento, enquanto
testar for verdadeiro, o bloco de aes ser executado. Aps cada
passagem, a vez de incrementar. Aqui est um exemplo de loop para
mostrar os nmeros de 0 a 9:
for ($i = 0; $i < 10; ++$i)
#
#
#
#
comea com $i = 0
executa enquanto $i < 10
incrementa $i antes de repetir
neste caso $i++ tem o mesmo efeito
{
print "$i\n";
}
_________________________________________________________________
14.
while e until
#
#
#
#
12
Tutorial On-Line
Tutorial Perl
_________________________________________________________________
15.
Exerccio
Tutorial On-Line
Tutorial Perl
{
...
}
Quando voc tiver feito isso, veja se pode alter-lo de modo que cada
nmero de linha seja mostrada como 001, 002, ..., 009, 010, 011, 012,
etc.
Para fazer isso, voc dever somente mudar uma linha inserindo quatro
caracteres extras. Lembre-se que o Perl permite isso.
_________________________________________________________________
Condicionais
claro que o Perl tambm permite testes condicionais if/then/else.
Eles possuem o seguinte formato:
if ($a)
{
print "A varivel no est vazia\n";
}
else
{
print "A varivel est vazia\n";
}
Para entender, recorde que o caractere vazio considerado como falso.
Ele tambm retorna falso se o caractere for zero.
Tambm possvel incluir mais alternativas em uma declarao
condicional:
if (!$a)
{
# ! o operador no
14
Tutorial On-Line
16.
Tutorial Perl
Exerccio
Comparando strings
Um dos mais teis recursos do Perl (seno o mais til) a poderosa
manipulao de strings. No corao desta, est a expresso regular (ER)
que compartilhada por muitos outros utilitrios do Unix.
_________________________________________________________________
17.
Expresses regulares
18.
A varivel especial $_
15
Tutorial On-Line
Tutorial Perl
19.
#
#
#
#
#
#
^f
^ftp
es$
# f no incio da linha
# ftp no incio da linha
# es no final da linha
und*
Tutorial On-Line
Tutorial Perl
#
#
#
#
un
und
undd
unddd (etc)
.*
^$
Existem ainda mais opes. Colchetes podem ser usados para comparar
qualquer um destes caracteres dentro deles. Entre colchetes, o smbolo indica entre e o smbolo ^ no incio significa no:
[qjk]
[^qjk]
[a-z]
[^a-z]
[a-zA-Z]
[a-z]+
#
#
#
#
#
#
#
tanto q ou j ou k
exceto q, j e k
qualquer um entre a e z, inclusive estes
exceto letras minsculas
qualquer letra
qualquer sequncia com pelo menos uma ou
mais letras minsculas
#
#
#
#
#
#
#
#
#
#
#
#
#
#
um newline
um tab
qualquer caractere alfanumrico (palavra)
o mesmo que [a-zA-Z0-9_]
exceto caracteres alfanumricos,
o mesmo que [^a-zA-Z0-9_]
qualquer dgito
o mesmo que [0-9]
exceto dgitos, [^0-9]
qualquer caractere em branco: espao,
tab, newline, etc
exceto caracteres em branco
uma palavra limitada, fora de []
nenhuma palavra limitada
17
Tutorial On-Line
\|
\[
\)
\*
\^
\/
\\
Tutorial Perl
#
#
#
#
#
#
#
barra vertical
colchetes esquerdo
parnteses direito
asterisco
circunflexo
uma barra
barra invertida
_________________________________________________________________
20.
#
#
#
#
#
#
#
#
#
#
#
#
_________________________________________________________________
21.
Exerccio
a letra x
a string para
a string para, sendo p maisculo ou minsculo
a palavra para ou Para, use \b para detectar palavras limitadas
com um espao em branco (newline, tab, etc)
18
Tutorial On-Line
Tutorial Perl
_________________________________________________________________
Substituio e traduo
Uma vez identificadas as expresses regulares, Perl permite fazer
substituies baseadas naquelas comparaes.
O modo de fazer isso usando a funo s que parecida com o modo de
substituio usado pelo editor de texto vi do Unix.
Mais uma vez o operador de comparao usado, e mais uma vez se ele
for omitido ento a substituio utilizar a varivel $_ em seu lugar.
Para substituir uma ocorrncia de londres por Londres na $sentena
devemos usar a expresso:
$sentenca =~ s/londres/Londres/
e para fazer o mesmo com a varivel $_ use:
s/londres/Londres/
Note que as duas expresses regulares esto usando um total de trs
barras. O resultado desta expresso o nmero de substituies feitas,
de modo que pode ser tanto zero (falso) como um (verdadeiro), no caso
acima.
_________________________________________________________________
22.
Opes
19
Tutorial On-Line
Tutorial Perl
23.
Recordando modelos
20
Tutorial On-Line
Tutorial Perl
21
Tutorial On-Line
Tutorial Perl
$busca = "par";
s/${busca}a/xxx/g;
_________________________________________________________________
24.
Traduo
25.
Exerccio
22
Tutorial On-Line
Tutorial Perl
_________________________________________________________________
Split
Uma funo muito til no Perl a split, que separa uma string e
coloca em uma matriz. A funo usa expresses regulares e tambm funciona
com a varivel especial $_.
A funo split usada desta forma:
$info = "Caine:Michael:Ator:Doce Liberdade";
@pessoal = split(/:/, $info);
que tem o mesmo efeito que:
@pessoal = ("Caine", "Michael", "Ator", "Doce Liberdade");
Se a informao estiver armazenada na varivel $_ ento poderemos usar
somente:
@pessoal = split(/:/);
Se os campos so divididos por vrios dois pontos, ento podemos usar
os cdigos ER para certos problemas. O cdigo:
23
Tutorial On-Line
Tutorial Perl
$_ = "Caine::Michael:::Ator";
@pessoal = split(/:+/);
o mesmo que:
@pessoal = ("Caine", "Michael", "Ator");
mas se no for usado, ento:
$_ = "Caine::Michael:::Ator";
@pessoal = split(/:/);
ser o mesmo que:
@pessoal = ("Caine", "", "Michael", "", "", "Ator");
Uma palavra pode ser separada em caracteres, uma sentena separada em
palavras e um pargrafo em sentenas:
@caracteres = split(//, $palavra);
@palavras = split(/ /, $sentenca);
@sentencas = split(/\./, $paragrafo);
No primeiro caso, a string nula comparada entre cada caractere, e
isso ocorre porque @caracteres uma matriz de caracteres, i., uma
matriz de strings com comprimento 1.
_________________________________________________________________
26.
Exerccio
___
par de ligaes ocorreu
para entender os proble
par existe a possibilid
par deve conter a final
Neste exerccio, voc deve fazer esse programa. Aqui esto algumas
dicas:
24
Tutorial On-Line
Tutorial Perl
Matrizes associativas
Uma lista comum de matriz permite acessar seus elementos atravs de
nmeros. O primeiro elemento da matriz @comida $comida[0]. O segundo
$comida[1], assim por diante, sendo que o ltimo elemento
$comida[$#comida].
Mas o Perl tambm permite criar matrizes que so acessadas por uma
string. Estas so chamadas de matrizes associativas.
Para definir uma matriz associativa, usamos a notao usual com
parnteses, mas a matriz agora prefixada por um sinal %. Suponha que
ns queremos criar uma matriz de pessoas com suas idades. Ela pode ser
algo como:
%idades = ("Michael Caine", 39,
"Den", 34,
25
Tutorial On-Line
Tutorial Perl
"Angie", 27,
"Willy", "21 anos de cachorro",
"A rainha me", 108);
Agora podemos encontrar a idade de cada pessoa com as seguintes
expresses:
$idade{"Michael Caine"};
$idade{"Den"};
$idade{"Angie"};
$idade{"Willy"};
$idade{"A rainha me"};
#
#
#
#
#
Retorna
Retorna
Retorna
Retorna
Retorna
39
34
27
"21 anos de cachorro"
108
Note que como na matriz comum, cada sinal % foi alterado para um $
para acessar um elemento individual porque cada elemento escalar. Mas,
de forma diferente da lista comum, onde o ndice colocado entre
parnteses, a idia est em facilitar o acesso atravs da associao de
cada par de elementos.
Uma matriz associativa pode ser convertida em uma comum apenas
atribuindo ela a uma varivel @, e vice-versa. Note porm que a converso
no coloca os elementos pares em ordem, como veremos adiante;
@info = %idades;
$info[5];
%maisidades = @info;
#
#
#
#
#
_________________________________________________________________
27.
Operadores
Tutorial On-Line
Tutorial Perl
da matriz. Essas funes retornam suas listas na mesma ordem, mas esta
ordem no tem nada a ver com a ordem em que os elementos foram inseridos.
Quando keys e values so chamadas em um contexto escalar, elas
retornam o nmero de pares na matriz associativa.
Existe tambm um funo que retorna uma lista de dois elementos de uma
chave e seu valor. Cada vez que chamada, ela retorna outro par de
elementos:
while (($pessoa, $idade) = each(%idades))
{
print "$pessoa tem $idade\n";
}
_________________________________________________________________
28.
Variveis de ambiente
_________________________________________________________________
Subrotinas
Como qualquer linguagem estruturada, Perl permite ao usurio definir
suas prprias funes, chamadas subrotinas. Elas podem ser colocadas em
qualquer lugar do programa, mas o ideal coloc-las no incio, ou tudo
no final. Uma subrotina tem sempre o formato:
sub subrotina
{
print "Esta uma rotina muito simples.\n";
print "Ela sempre faz a mesma coisa...\n";
}
27
Tutorial On-Line
Tutorial Perl
29.
Parmetros
30.
Retornando valores
28
Tutorial On-Line
Tutorial Perl
else
{
$_[1];
}
}
Neste exemplo, $maior ser igual a 37:
$maiorvalor = &maior(37, 24);
A subrotina &primeiros tambm retorna um valor, que neste caso 1.
Isto ocorre porque a ltima coisa que aconteceu foi a execuo da funo
print, e quando essa declarao funciona corretamente, ela resulta em 1.
_________________________________________________________________
31.
Variveis locais
#
#
#
#
#
#
}
A seguinte expresso retorna verdadeiro:
&dentro("mamo", "lima mo");
De fato, voc tambm pode eliminar redundncias substituindo as duas
primeiras declaraes do bloco pela linha:
local($a, $b) = ($_[0], $_[1]);
29