Escolar Documentos
Profissional Documentos
Cultura Documentos
Tutorial Perl
Reviso:
11/03/99
UM PROGRAMA SIMPLES
9
9
9
A PRIMEIRA LINHA
COMENTRIOS E DECLARAES
IMPRIMINDO NA TELA
3
3
3
EXECUTANDO O PROGRAMA
VARIVEIS ESCALARES
9
9
9
OPERAES E ATRIBUIES
INTERPOLAO
EXERCCIO
5
6
6
VARIVEIS DE MATRIZES
9
9
9
7
8
8
ATRIBUIES DE MATRIZES
MOSTRANDO MATRIZES
EXERCCIO
MANIPULANDO ARQUIVOS
9
8
10
EXERCCIO
Tutorial On-Line
Tutorial Perl
ESTRUTURAS DE CONTROLE
10
9
9
9
9
9
11
11
11
12
13
FOREACH
TESTANDO
FOR
WHILE E UNTIL
EXERCCIO
CONDICIONAIS
13
14
EXERCCIO
COMPARANDO STRINGS
14
9
9
9
9
9
15
15
15
17
18
EXPRESSES REGULARES
A VARIVEL ESPECIAL $_
MAIS SOBRE ERS
ALGUNS EXEMPLOS DE ERS
EXERCCIO
SUBSTITUIO E TRADUO
18
9
9
9
9
19
20
21
21
OPES
RECORDANDO MODELOS
TRADUO
EXERCCIO
SPLIT
22
23
EXERCCIO
MATRIZES ASSOCIATIVAS
24
9
9
25
26
OPERADORES
VARIVEIS DE AMBIENTE
SUBROTINAS
26
9
9
9
27
27
28
PARMETROS
RETORNANDO VALORES
VARIVEIS LOCAIS
_________________________________________________________________
Tutorial On-Line
Tutorial Perl
Um programa simples
Aqui est um programa simples que usaremos para comearmos:
#!/usr/local/bin/perl
print 'Ol mundo.';
# mostra uma mensagem
Cada parte ser discutida a seguir.
_________________________________________________________________
9 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.
_________________________________________________________________
9 Comentrios e declaraes
Comentrios podem ser inseridos em um programa atravs do smbolo #, e
qualquer coisa aps ele, at o final da linha, ignorado (com exceo da
primeira linha). A nica maneira de usar comentrios longos colocando #
no incio de cada linha.
Toda declarao em Perl deve terminar com um ponto-e-vrgula, como na
ltima linha do programa acima.
_________________________________________________________________
9 Imprimindo na tela
A primeira funo exibe informaes. No caso acima, ele mostra a
cadeia de caracteres Ol mundo.
Este resultado ser mostrado somente se for executado na linha de
comandos. Para que a mesma informao seja mostrada pelo seu browser,
voc deve modificar o programa, de forma que a mensagem seja reconhecida
pelo formato HTML ou como texto simples.
print "Content-type: text/html\n\n";
# informa ao browser
print 'Ol mundo.';
# mostra a mensagem simples, sem formatao
O prximo passo rod-lo.
_________________________________________________________________
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.
_________________________________________________________________
9 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
= $b;
+= $b;
-= $b;
.= $b;
#
#
#
#
atribui $b para $a
soma $b para $a
subtrai $b de $a
acrescenta $b em $a
Tutorial On-Line
Tutorial Perl
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.
_________________________________________________________________
9 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.
_________________________________________________________________
9 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.
Certifique-se de que o programa funciona, antes de prosseguir.
_________________________________________________________________
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.
_________________________________________________________________
9 Atribuies de matrizes
No Perl, a mesma expresso em um contexto diferente pode produzir um
resultado diferente. A primeira atribuio abaixo expande a varivel
@musica de modo que fique equivalente segunda atribuio:
@mais_musica = ("rgo", @musica, "harpa");
@mais_musica = ("rgo", "flauta", "gaita", "harpa");
Isto deve sugerir um modo de acrescentar elementos em uma matriz. Um
modo simples de acrescentar estes elementos usar a declarao:
push(@comida, "ovos");
que acrescenta ovos ao fim da matriz @comida. Para acrescentar dois ou
mais itens, use um dos seguintes formatos:
push(@comida, "ovos", "carne");
push(@comida, ("ovos", "carne"));
push(@comida, @mais_comida);
Alm disso, a funo push retorna o comprimento da nova lista.
Para remover o ltimo item de uma lista e retorn-lo, use a funo
pop. De nossa primeira lista, a funo pop retorna uvas e @comida passa a
ter dois elementos:
$outra_comida = pop(@comida);
Tutorial On-Line
Tutorial Perl
#
#
#
($a, @alguma_comida) = @comida; #
#
#
(@alguma_comida, $a) = @comida; #
#
9 Mostrando matrizes
Desde que contexto importante, no surpresa que os seguintes
comandos produzem resultados diferentes:
print @comida;
# resultado bvio
print "@comida"; # tratado como string
print @comida.""; # em um contexto escalar
_________________________________________________________________
9 Exerccio
Experimente cada uma das trs declaraes acima para ver o que elas
fazem.
_________________________________________________________________
Manipulando arquivos
8
Tutorial On-Line
Tutorial Perl
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
9 Exerccio
Modifique o programa acima de modo que todo o arquivo contenha o
smbolo # no incio de cada linha.
Voc dever somente acrescentar uma linha e modificar uma delas. Use a
varivel $".
Coisas inesperadas podem ocorrer com arquivos, ento voc pode
encontrar alguma ajuda com o uso da opo w, como mencionado no tpico
Executando o programa.
_________________________________________________________________
Estruturas de controle
10
Tutorial On-Line
Tutorial Perl
9 foreach
Para executar cada linha de uma matriz ou de outra estrutura com
formato de lista (como linhas em um arquivo), Perl usa a estrutura
foreach. Ela tem o seguinte formato:
foreach $petisco (@comida)
{
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.
_________________________________________________________________
9 Testando
As prximas e poucas estruturas contam com os testes booleanos
verdadeiro ou falso. O nmero zero, sendo zero um caractere, e o
caractere vazio ("") so contados como falsos. Aqui esto alguns testes
em nmeros e strings:
$a == $b
$a != $b
$a eq $b
$a ne $b
#
#
#
#
#
# $a e $b so verdadeiros?
# $a ou $b verdadeiro?
# $a falso?
_________________________________________________________________
9 for
Perl possui a estrutura for que funciona da mesma forma que no C. Ele
tem o formato:
11
Tutorial On-Line
Tutorial Perl
#
#
#
#
comea com $i = 0
executa enquanto $i < 10
incrementa $i antes de repetir
neste caso $i++ tem o mesmo efeito
{
print "$i\n";
}
_________________________________________________________________
9 while e until
Aqui est um programa que l do teclado e no continua at que a senha
correta seja digitada:
#!/usr/local/bin/perl
print "Senha? ";
# pede pela senha
$a = <STDIN>;
# l do teclado
chop $a;
# remove o newline no final da linha
while ($a ne "teste")
# enquanto a senha estiver errada...
{
print " errada.\n Senha? "; # solicita novamente
$a = <STDIN>;
# l do teclado
chop $a;
# remove o caractere newline no final
}
O bloco de cdigo entre chaves executado enquanto a entrada no for
igual a senha. A estrutura while deve ser de fcil compreenso, mas
oportuno notar diversos detalhes.
Primeiro, ns podemos ler de uma entrada padro (teclado) sem precisar
abri-la.
Segundo, quando a senha digitada, $a inclui o caractere newline no
final (ao pressionar enter/return). A funo chop remove o ltimo
caractere de uma string que neste caso o newline.
Para testar o oposto, ns podemos usar a declarao until do mesmo
modo. Este executa o bloco repetidamente at que a expresso seja
verdadeira, e no enquanto ela verdadeira.
Outra tcnica til, colocar o while ou until no final do bloco de
declaraes, em vez de colocar no incio. Isto requer a presena do
operador do para marcar o incio do bloco e o teste no final.
12
Tutorial On-Line
Tutorial Perl
Novamente, o programa acima pode ento ser escrito desta forma (note
que o bloco ser executado pelo menos uma vez):
#!/usr/local/bin/perl
do
{
print "Senha? ";
$a = <STDIN>;
chop $a;
}
while ($a ne "teste");
# until ($a eq "teste");
_________________________________________________________________
9 Exerccio
Modifique o programa do exerccio anterior de modo que cada linha do
arquivo seja lida uma a uma, e retorne com um nmero de linha no incio.
Voc deve ter algo como:
1 root:oYpYXm/qRO6N2:0:0:Super-User:/:/bin/csh
2 sysadm:*:0:0:System V
Administration:/usr/admin:/bin/shdiag:*:0:996:Hardware
Diagnostics:/usr/diags:/bin/csh
3 etc
Talvez seja interessante usar esta estrutura:
while ($linha = <INFO>)
{
...
}
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)
13
Tutorial On-Line
Tutorial Perl
{
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
{
print "A varivel est vazia\n";
}
elsif (length($a) == 1)
# se acima falir, tente isso
{
print "A varivel tem um caractere\n";
}
else
# se tambm falir...
{
print "A varivel tem vrios caracteres\n";
}
Neste caso, importante notar que a declarao elsif est correta,
sem o e de elseif.
_________________________________________________________________
9 Exerccio
Encontre um arquivo grande com algum texto e algumas linhas em branco.
Do exerccio anterior, voc deve ter um programa que mostra o arquivo
de senhas com nmeros de linhas. Mude ele de modo que funcione com o
outro arquivo de texto.
Agora altere o programa de modo que aqueles nmeros no sejam
mostrados ou contados com linhas em branco, mas toda linha permanece
sendo mostrada, incluindo as em branco. Recorde que, quando uma linha do
arquivo lida, ela continua incluindo seu caractere newline no final.
_________________________________________________________________
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.
_________________________________________________________________
14
Tutorial On-Line
Tutorial Perl
9 Expresses regulares
Uma expresso regular sempre est contida entre barras, e a comparao
ocorre com o operador =~. A seguinte expresso verdadeira se a string
aparecer na varivel $sentena:
$sentenca =~ /para/
A ER case sensitive, de modo que se:
$sentenca = "Para as raposas";
ento a comparao resultar em falsa. O operador !~ usado para o
oposto, sendo assim o exemplo:
$sentenca !~ /para/
retorna verdadeiro porque a string no aparece em $sentena.
_________________________________________________________________
9 A varivel especial $_
Ns podemos usar uma condicional como:
if ($sentenca =~ /sob/)
{
print "Ns estamos conversando\n";
}
que dever mostrar a mensagem se tivermos um dos seguintes valores:
$sentenca = "Embaixo e sob";
$sentenca = " sobre o assunto...";
Porm mais frequentemente e muito mais fcil se atribuirmos a
sentena uma varivel especial $_ (certamente escalar).
Se ns fizermos isso, ento podemos evitar o uso dos operadores de
comparao e o exemplo acima pode ser escrito como:
if (/sob/)
{
print "Ns estamos conversando\n";
}
A varivel $_ padro para muitas operaes do Perl e tende a ser
muito usado.
_________________________________________________________________
15
Tutorial On-Line
Tutorial Perl
#
#
#
#
#
#
^f
^ftp
es$
# f no incio da linha
# ftp no incio da linha
# es no final da linha
und*
.*
^$
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
16
Tutorial On-Line
Tutorial Perl
#
#
#
#
#
#
#
#
#
#
#
#
#
#
\W
\d
\D
\s
\S
\b
\B
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
#
#
#
#
#
#
#
barra vertical
colchetes esquerdo
parnteses direito
asterisco
circunflexo
uma barra
barra invertida
_________________________________________________________________
#
#
#
#
#
17
Tutorial On-Line
\/ *0
\/\s+0
\/\s+0\.0*
Tutorial Perl
#
#
#
#
#
#
#
_________________________________________________________________
9 Exerccio
Seu programa anterior contava linhas no-vazias. Altere ele de modo
que conte somente linhas com:
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)
_________________________________________________________________
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.
18
Tutorial On-Line
Tutorial Perl
9 Opes
Este exemplo somente substitui a primeira ocorrncia da string, mas
pode ser que tenha mais do que uma string que desejamos substituir.
Para fazer uma substituio global, a ltima barra deve ser seguida
por um g:
s/londres/Londres/g
que obviamente utiliza a varivel $_. Novamente a expresso retorna o
nmero de substituies realizadas, que zero ou alguma coisa maior que
zero (verdadeiro).
19
Tutorial On-Line
Tutorial Perl
9 Recordando modelos
frequentemente til recordar modelos que tem sido comparados de modo
que eles possam ser usados novamente. Isto ocorre porque qualquer coisa
comparada entre parnteses retorna nas variveis $1,...,$9. Estas strings
tambm podem ser usadas da mesma forma que nas expresses regulares (ou
substituies) utilizando os cdigos especiais ER \1,...,\9.
Esse teste:
$_ = "Lorde Whopper de Fibbing";
s/([A-Z])/:\1:/g;
print "$_\n";
colocar cada letra maiscula entre : (dois pontos). Neste exemplo,
mostrar :L:orde :W:hopper de :F:ibbing. As variveis $1,...,$9 so
somente de leitura, voc no pode alter-las.
Como outro exemplo, o teste:
if (/(\b.+\b) \1/)
{
print "Encontrou $1 repetida\n";
}
ir identificar qualquer palavra repetida. Cada \b representa uma
palavra limitada e .+ compara qualquer string no vazia, ento \b.+\b
compara qualquer coisa entre duas palavras limitadas.
O resultado ento armazenado como \1 para expresses regulares e como
$1 para o resto do programa.
Se $_ for igual a "teste teste teste2 teste2", a mensagem ser
mostrada, mas somente com a primeira ocorrncia.
O seguinte exemplo troca o primeiro e ltimo caracteres da linha na
varivel $_:
s/^(.)(.*)(.)$/\3\2\1/
O ^ e o $ comparam o incio e o fim da linha. O cdigo \1 armazena o
primeiro caractere, o \2 armazena cada string entre os dois e o ltimo
caractere armazenado no cdigo \3. Ento aquela linha substituda com
a troca entre \1 e \3.
Aps uma comparao, voc pode usar variveis especiais somente de
leitura $` ou $& ou $' para encontrar o que foi comparado antes, durante
e depois da busca. Ento:
$_ = "Lorde Whopper de Fibbing";
/pp/;
resultar em verdadeiro nas seguintes declaraes (recorde que eq um
teste usado em strings):
$` eq "Lorde Who";
$& eq "pp";
$' eq "er de Fibbing";
20
Tutorial On-Line
Tutorial Perl
9 Traduo
A funo tr permite a traduo caractere-a-caractere. A seguinte
expresso substitui cada a com e, cada b com d, cada c com f na varivel
$sentena. A expresso retorna o nmero de substituies efetuadas:
$sentenca =~ tr/abc/edf/
A maioria dos cdigos especiais ER no se aplica funo tr. Por
exemplo, a prxima declarao conta o nmero de asteriscos na varivel
$sentena e armazena na varivel $contagem:
$contagem = ($sentenca =~ tr/*/*/);
Contudo, o trao permanece como seu uso entre. Esta declarao
converte toda $_ para letra maiscula:
tr/a-z/A-Z/;
_________________________________________________________________
9 Exerccio
Seu ltimo programa contava linhas de um arquivo que continham uma
certa string.
Modifique ele de modo que conte linhas com letras duplas (ou qualquer
outro caractere duplo).
Modifique novamente para que estas letras duplas apaream entre
parnteses. Por exemplo, seu programa deve produzir algo como:
023 E(ss)es pioneiros conduziram muitas se(ss)es
Tente fazer com que todos os pares de letras sejam colocados entre
parnteses, e no apenas o primeiro par de cada linha.
21
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");
22
Tutorial On-Line
Tutorial Perl
9 Exerccio
Uma ferramenta til no processamento de nossa lngua natural a
concordncia. Este permite que uma string especfica seja mostrada em seu
contexto imediato, em qualquer lugar que aparea no texto.
Por exemplo, um programa de concordncia identificando a string
destino par talvez possa produzir alguma das seguintes sadas. Note como
as ocorrncias da string destino se alinham verticalmente:
o primeiro
sendo que
no segundo
s o ltimo
___
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:
23
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,
24
Tutorial On-Line
Tutorial Perl
"Den", 34,
"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;
#
#
#
#
#
_________________________________________________________________
9 Operadores
Matrizes associativas no ordenam seus elementos (elas so como
grandes tabelas confusas) mas possvel acessar todos seus elementos
usando funes de chaves e funes de valores:
foreach $pessoa (keys %idades)
{
print "Eu sei a idade de $pessoa\n";
}
foreach $idade (values %idades)
{
print "Algum tem $idade\n";
}
Quando keys chamada, ela retorna uma lista de ndices da matriz
associativa. Quando values chamada, ela retorna uma lista dos valores
25
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";
}
_________________________________________________________________
9 Variveis de ambiente
Quando voc roda um programa em Perl, ou qualquer script no Unix,
certas variveis de ambientes so setadas. Algumas podem ser como
$ENV{'USER'} que contm o username (nome do usurio logado).
Quando voc roda um script CGI na WWW, existem variveis de ambiente
que possuem outras informaes teis. Todas essas variveis e seus
valores so armazenados na matriz associativa %ENV em que as chaves so
os nomes das variveis. O seguinte exemplo retorna todas as suas
variveis de ambiente:
while (($chave, $valor) = each(%ENV))
{
print "$chave igual a $valor\n";
}
_________________________________________________________________
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";
}
As seguintes declaraes servem para chamar a subrotina. Note que ela
invocada com um caractere & na frente do nome:
&subrotina;
# chama a subrotina
26
Tutorial On-Line
Tutorial Perl
&subrotina($_);
# chama ela com um parmetro
&subrotina(1+2, $_); # chama com dois parmetros
_________________________________________________________________
9 Parmetros
Nos casos acima, os parmetros so aceitos porm ignorados. Quando a
subrotina chamada, os parmetros so passados como uma lista na
varivel especial @_. Esta varivel no tem nada a ver com a varivel
escalar $_. A seguinte subrotina simplesmente mostra a lista de
argumentos passados:
sub argumentos
{
print "@_\n";
}
Alguns exemplos de seu uso:
&argumentos("primeiro", "segundo");
&argumentos("mas", "e", "uvas");
9 Retornando valores
O resultado de uma subrotina sempre a ltima coisa a se realizar.
Esta subrotina retorna o maior valor:
sub maior
{
if ($_[0] > $_[1])
{
$_[0];
}
else
{
$_[1];
}
}
27
Tutorial On-Line
Tutorial Perl
9 Variveis locais
A varivel @_ local somente para a corrente subrotina, e assim so
as demais, como $_[0], $_[1], etc. Outras variveis tambm podem ser
locais, e isto til se quisermos comear alterando os parmetros
passados. A seguinte subrotina verifica se uma string est dentro de
outra, comparando sem os espaos entre as palavras:
sub dentro
{
local($a, $b);
($a, $b) = ($_[0], $_[1]);
$a =~ s/ //g;
$b =~ s/ //g;
($a =~ /$b/ || $b =~ /$a/);
#
#
#
#
#
#
}
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]);
28