Sei sulla pagina 1di 18

TUTORIAL CGI-BIN

CGI/Perl: O Incio Perl uma linguagem de programao, e CGI um protocolo de comunicao (um
cdigo) atravs do qual o servidor HTTP (ou servidor e!) intermedia a trans"er#ncia de in"orma$es
entre um programa (no mesmo computador que o servidor) e um cliente HTTP (o seu !roser)%
&o correto "alar 'eu quero um CGI que "aa tal coisa', mas sim 'eu quero um programa que use CGI e
"aa tal coisa', ou de maneira mais curta 'eu quero um programa CGI que "aa tal coisa' ou 'eu quero
um script que "aa tal coisa'%
(m script no implica em CGI, mas scripts Perl (programas Perl) tornaram)se to comuns em se tratando
de CGI, que "alar script *+ quer di,er 'programa CGI escrito em Perl'%
- sempre !om lem!rar que um programa CGI pode ser "eito em qualquer linguagem usada no mesmo
computador que o servidor, no s em Perl%
.as o status alcanado por Perl devido a suas qualidades para tare"as associados a CGI e por sua
porta!ilidade%
/% (m programa simples
0 primeira lin1a
Coment+rios e declara$es
Imprimindo na tela
2% 34ecutando o programa
5% 6ari+veis escalares
7pera$es e 0tri!ui$es
Interpletao
34erc8cio
9% 6ari+veis de matri,es
0tri!ui$es de matri,es
.ostrando matri,es
34erc8cio
:% .anipulando arquivos
34erc8cio
;% 3struturas de controle
"oreac1
Testando
"or
1ile e until
34erc8cio
<% Condicionais
34erc8cio
=% Comparando strings
34press$es regulares
0 vari+vel especial >?
.ais so!re 3@s
0lguns e4emplos de 3@s
34erc8cio
A% Bu!stituio e traduo
7p$es
@ecordando modelos
Traduo
34erc8cios
/C% Bplit
34erc8cio
//% .atri,es associativas
7peradores
6ariavis de 0m!iente
/2% Bu!rotinas
ParDmetros
@etornado 6alores
6ari+veis Eocais
Um programa simples 0qui est+ um programa simples que usaremos para comearmosF
#!/usr/local/bin/perl
print 'Ol mundo.'; # mostra uma mensagem
Cada parte ser+ discutida a seguir%
A primeira linha Todo programa escrito em Perl deve sempre comear com esta lin1aF
#!/usr/local/bin/perl
Contudo, ela pode variar de sistema para sistema% 3sta lin1a indica para o servidor o que "a,er com o
arquivo quando ele e4ecutado (i%, rodar o programa atravs do Perl) e in"orma a locali,ao e4ata do
compilador%
Comentrios e !eclara"#es Coment+rios podem ser inseridos em um programa atravs do s8m!olo #,
e qualquer coisa aps ele, at o "inal da lin1a, ignorado (com e4ceo da primeira lin1a)% 0 Gnica
maneira de usar coment+rios longos colocando # no in8cio de cada lin1a%
Toda declarao em Perl deve terminar com um ponto)e)v8rgula, como na Gltima lin1a do programa
acima%
Imprimin!o na tela 0 primeira "uno e4i!e in"orma$es% &o caso acima, ele mostra a cadeia de
caracteres 7l+ mundo%
3ste resultado ser+ mostrado somente se "or e4ecutado na lin1a de comandos% Para que a mesma
in"ormao se*a mostrada pelo seu !roser, voc# deve modi"icar o programa, de "orma que a mensagem
se*a recon1ecida pelo "ormato HT.E ou como te4to simples%
print "Content-type: text/html\n\n";
# informa ao
browser
print 'Ol mundo.'; # mostra a mensagem simples, sem formatao
7 pr4imo passo rod+)lo%
$%ec&tan!o o programa Higite o programa acima em um editor de te4to, depois salve ele% 34istem
duas "ormas de instalar seu programa no servidorF
Pelo (ni4 (requer con1ecimento !+sico), 3macs um !om editor porque possui o modo Perl que "ormata
lin1as "acilmente quando voc# pressiona ta! (use .)4 perl)mode)%
Pelo ITP, use qualquer editor de te4to puro, e envie o arquivo atravs de um programa de ITP
(CuteITP ou JB?ITP), importante que se*a usado o modo de trans"er#ncia 0BCII, e nunca Kin+rio%
7 programa deve ser salvo com a e4tenso %cgi (que indica ser um script) ou com %pl (de Perl), e depois
torn+)lo e4ecut+vel%
Pelo (ni4, digiteF
chmo! &'% programa
na lin1a de comandos, onde programa o nome do seu arquivo%
Pelo ITP, clique em alterar atri!utos do arquivo, escol1endo o valor <:: ()r4r)4r)4)%
0gora rode o programa apenas digitando um destes comandosF
perl programa (pelo H7B ou (&IL)
(/programa (pelo (&IL)
programa (pelo H7B)
Caso voc# este*a usando a lin1a de comandos do H7B, necess+rio ter o programa Perl "or Jin52
instalado, ele pode ser retirado no endereoF
1ttpFMM%activestate%comM
Be algo ocorrer de errado, podem aparecer mensagens de erro, ou nada% 6oc# pode sempre rodar o
programa com mensagens atravs do comandoF
perl -) programa
3le mostrar+ avisos e outras mensagens de a*uda antes de tentar e4ecutar o programa% Para rod+)lo
com a depurao, use o comandoF
perl -! programa
7 Perl compila primeiro o programa e ento e4ecuta sua verso compilada% 0ssim, aps uma pequena
pausa para compilao, o programa deve rodar rapidamente%
Certi"ique)se de que o programa est+ "uncionando antes de continuar%
*ari+eis escalares 7 tipo mais usado de vari+vel no Perl o escalar% 6ari+veis escalares podem
conter caracteres eMou nGmeros, e note que eles so completamente intercam!i+veis% Por e4emplo, a
declaraoF
$prioridade = 9;
atri!ui a vari+vel escalar >prioridade o valor A, mas voc# pode tam!m designar uma string (cadeia de
caracteres) para a mesma vari+velF
>prioridade N OaltaOP
Perl tam!m aceita nGmeros como stringsF
$prioridade = '9';
$default = '0009';
e ainda pode reali,ar opera$es aritmticas ou outras%
3m geral, nomes de vari+veis consistem de nGmeros, letras e s8m!olos ? mas no devem comear com
nGmeros depois do $% 0 vari+vel $_ especial, como veremos mais tarde% 0lm disso, o Perl case
sensitive, i%, letras maiGsculas so di"erentes de minGsculas, por e4emplo, $a e $A so vari+veis
distintas%
7pera$es e 0tri!ui$es Interpletao 34erc8cio
Opera"#es e Atri,&i"#es 7 Perl utili,a todas as opera$es usuais na linguagem CF
$a = 1 + 2; # soma 1 e 2 e armazena em $a
$a = 3 - 4; # subtrai 4 de 3 e armazena em $a
$a = 5 * 6; # multiplica 5 por 6
$a = 7 / 8; # divide 7 por 8 e retorna 0.875
$a = 9 ** 10; # 9 elevado por 10
$a = 5 % 2; # resto da diviso de 5 por 2
++$a; # incrementa $a e retorna seu valor
$a++; # retorna $a e depois incrementa em 1
--$a; # decrementa $a e retorna seu valor
$a--; # retorna $a e depois decrementa em 1
e para caracteres, e4istem os seguintes operadoresF
$a = $b . $c; # concatena $b e $c
$a = $b x $c; # $b repetido $c vezes
Para atri!uir valores, Perl utili,aF
$a = $b; # atribui $b para $a
$a += $b; # soma $b para $a
$a -= $b; # subtrai $b de $a
$a .= $b; # acrescenta $b em $a
&ote que quando Perl atri!ui um valor como >a N >!, ele "a, uma cpia de >! e ento o atri!ui para >a%
Portanto, na pr4ima ve, que voc# alterar >!, ele no ir+ alterar >a%
7utras opera$es podem ser encontradas atravs do comando man perlop na lin1a de comandos do
(ni4%
Interpleta"-o 7 seguinte cdigo mostra mas e p#ras usando concatenaoF
$a = 'mas';
$b = 'pras';
print $a.' e '.$b;
Beria mais "+cil incluir somente uma string no "inal da declarao print, mas a lin1aF
print '$a e $b';
mostra somente >a e >!, e no mas e p#ras, o que no o nosso caso% 0o invs disso, podemos usar
aspas duplas no lugar de aspas simplesF
print "$a e $b";
3stas aspas "oram a interpolao de qualquer cdigo, incluindo interpretao de vari+veis% Isso mais
apropriado que nossa declarao original% 7utros cdigos que so interpolados incluem caracteres como
neline e ta!% 7 cdigo .n o neline (enterMreturn) e .t o ta!%
7utros e4emplos que produ,em o mesmo resultadoF
print ' Meu e-mail nome@dominio.com '."\n";
print " Meu e-mail nome\@dominio.com \n";
&ote que, com aspas duplas, se "a, necess+rio o uso da !arra invertida antes do Q, porque seno ele
ser+ interpretado como sendo uma vari+vel, que veremos adiante%
$%erccios &este e4erc8cio voc# deve reescrever seu primeiro programa de modo que /01 a string se*a
atri!u8da para uma vari+vel e /21 esta vari+vel se*a impressa com um caractere neline% (se as aspas
duplas e no utili,e o operador de concatenao%
Certi"ique)se de que o programa "unciona, antes de prosseguir%
*ari+eis !e matri3es (m tipo mais interessante de vari+vel o de matri,es (vetores) que uma lista
de vari+veis escalares% 6ari+veis de matri,es tem o mesmo "ormato das escalares e4ceto que eles so
pre"i4ados pelo s8m!olo Q% 0s declara$esF
@comida = ("mas", "pras", "uvas");
@musica = ("flauta", "gaita");
atri!uem tr#s elementos para a matri, Qcomida e dois para a matri, Qmusica%
0 matri, acessada pelo uso de 8ndices comeando do ,ero, e colc1etes so usados para especi"icar
cada 8ndice% 0 e4pressoF
$comida[2]
retorna uvas% &ote que o s8m!olo Q "oi mudado para > porque uvas o valor de uma vari+vel escalar%
0tri!ui$es de matri,es .ostrando matri,es 34erc8cio
Atri,&i"#es !e matri3es
&o Perl, a mesma e4presso em um conte4to di"erente pode produ,ir um
resultado di"erente% 0 primeira atri!uio a!ai4o e4pande a vari+vel
Qmusica de modo que "ique equivalente R segunda atri!uioF
@mais_musica = ("rgo", @musica, "harpa");
@mais_musica = ("rgo", "flauta", "gaita", "harpa");
Isto deve sugerir um modo de acrescentar elementos em uma matri,% (m
modo simples de acrescentar estes elementos usar a declaraoF
push(@comida, "ovos");
http://www.microsoft.co
m/brasil/ie50/ http://www.
microsoft.com/brasil/ie50
/
http://www.netscape.com/
computing/download/inde
x.html?
cp=hom05tdow http://ww
w.netscape.com/computin
g/download/index.html?
cp=hom05tdow
que acrescenta ovos ao "im da matri, Qcomida% Para acrescentar dois ou
mais itens, use um dos seguintes "ormatosF
push(@comida, "ovos", "carne");
push(@comida, ("ovos", "carne"));
push(@comida, @mais_comida);
0lm disso, a "uno pus1 retorna o comprimento da nova lista%
Para remover o Gltimo item de uma lista e retorn+)lo, use a "uno pop% He
nossa primeira lista, a "uno pop retorna uvas e Qcomida passa a ter dois
elementosF
$outra_comida = pop(@comida);# agora $outra_comida =
"uvas"
Tam!m poss8vel atri!uir uma matri, para uma vari+vel escalar% 0 lin1aF
$c = @comida;
atri!ui apenas o comprimento de Qcomida, mas
$c = "@comida";
trans"orma a lista em uma string com um espao entre cada elemento% 3ste
espao pode ser su!stitu8do por qualquer outro caractere apenas mudando
o valor da vari+vel especial >' (por e4emplo, >' N ' mais 'P)% 3sta vari+vel
apenas uma de muitas outras usadas na linguagem Perl%
.atri,es tam!m podem ser usadas para "a,er mGltiplas atri!ui$es para
vari+veis escalaresF
($a, $b) = ($c, $d); # o mesmo que $a=$c; $b=$d;
($a, $b) = @comida; # $a e $b so os primeiros itens de
@comida.
($a, @alguma_comida) = @comida; # $a o primeiro item
de @comida e @alguma_comida uma lista dos
# demais elementos.
(@alguma_comida, $a) = @comida; # @alguma_comida =
@comida e $a indefinida.
0 Gltima atri!uio ocorre desta maneira porque matri,es consomem tudo,
e Qalguma?comida retira todos os elementos de Qcomida% Portanto, este
"ormato deve ser evitado%
Iinalmente, voc# pode querer encontrar o 8ndice do Gltimo elemento de
uma lista%
Para "a,er isso, use a e4pressoF
$#comida
CopSrig1t T /AAA BTI Internet% Todos os direitos reservados%
4ostran!o matri3es Hesde que conte4to importante, no surpresa que os seguintes comandos
produ,em resultados di"erentesF
print @comida; # resultado bvio
print "@comida"; # tratado como string
print @comida.""; # em um contexto escalar
$%erccios 34perimente cada uma das tr#s declara$es citadas em '.ostrando matri,es' para ver o que
elas "a,em%
4anip&lan!o ar5&i+os
0qui est+ um programa !+sico em Perl que "a, o mesmo que o
comando cat do (ni4 em um certo arquivoF
#!/usr/local/bin/perl
#
# Programa para abrir o arquivo de senhas, ler,
# escrever, e fech-lo.
$arquivo = '/etc/passwd'; # nome do arquivo
open(INFO, $arquivo); # abre o arquivo
@linhas = ; # coloca ele em uma matriz
close(INFO); # fecha o arquivo
print @linhas; # exibe a matriz
0 "uno open a!re um arquivo para entrada (i%, para leitura)% 7
primeiro parDmetro o nome que permite ao Perl re"erir o arquivo
"uturamente% 7 segundo parDmetro a e4presso denotando o nome
do arquivo com sua locali,ao%
Be o nome do arquivo "or escrito entre aspas, ento ele tomado
literalmente sem a e4panso s1ell do (ni4% 0ssim, a e4presso
OUMetcMpassdO no ser+ interpretada com sucesso% Be voc# dese*a
"orar a e4panso s1ell, ento use os s8m!olos V e W, neste caso,
VUMetcMpassdW%
0 "uno close di, ao Perl para "ec1ar o arquivo%
34istem poucos pontos para acrescentar so!re a manipulao de
arquivos%
Primeiro, a declarao open pode tam!m especi"icar um arquivo para
sa8da ou para acrscimo, assim como para entrada% Para "a,er isso,
use o s8m!olo W para sa8da e WW para acrscimosF
open(INFO, $arquivo); # abre para leitura
open(INFO, ">$arquivo"); # abre para escrita
open(INFO, ">>$arquivo"); # permite acrescentar
open(INFO, "<$arquivo"); # tambm abre para leitura
Begundo, se voc# quiser gravar alguma in"ormao em um arquivo,
voc# deve a!ri)lo para escrita e ento pode usar a declarao print com
um parDmetro e4tra% Para gravar uma string no arquivo I&I7 useF
print INFO "Esta linha vai para o arquivo.\n";
Terceiro, voc# pode usar o seguinte comando para a!rir a entrada
padro (usualmente o teclado) e a sa8da padro (usualmente a tela)
respectivamenteF
open(INFO, '-'); # abre entrada padro
open(INFO, '>-'); # abre sada padro
&o programa acima, a in"ormao lida do arquivo% 7 arquivo c1ama)
se I&I7 e para ler ele atravs do Perl, coloque entre os s8m!olos V e
W%
0ssim, a declaraoF
@linhas = <INFO>;
l# o arquivo denotado por I&I7 e coloca dentro da matri, Qlin1as%
&ote que a e4presso VI&I7W l# o arquivo inteiro em apenas um
passo% Isto ocorre porque a leitura tratada como uma vari+vel de
matri,%
Be Qlin1as "osse su!stitu8da por uma vari+vel escalar >lin1as, ento
somente a primeira lin1a seria lida (e depois as pr4imas)% 3m am!os
casos, cada lin1a arma,enada completamente com seu caractere
neline no "inal%
34erc8cio
$%erccio
#!/usr/local/bin/perl
#
# Programa para abrir o arquivo de senhas, ler,
# escrever, e fech-lo.
$arquivo = '/etc/passwd'; # nome do arquivo
open(INFO, $arquivo); # abre o arquivo
@linhas = ; # coloca ele em uma matriz
close(INFO); # fecha o arquivo
print @linhas; # exibe a matriz
.odi"ique o programa acima de modo que todo o arquivo conten1a o
s8m!olo # no in8cio de cada lin1a%
6oc# dever+ somente acrescentar uma lin1a e modi"icar uma delas%
(se a vari+vel $'%
Coisas inesperadas podem ocorrer com arquivos, ento voc# pode
encontrar alguma a*uda com o uso da opo X, como mencionado no
tpico 34ecutando o programa%
$str&t&ras !e controle Possi!ilidades mais interessantes aparecem quando ns introdu,imos as
estruturas de controle e o looping% Perl suporta muitos tipos di"erentes de estruturas de controle que
tendem a ser como na linguagem C, mas muitos so similares aos do Pascal, tam!m% 0qui discutiremos
um pouco delas%
"oreac1 Testando "or 1ile e until 34erc8cio
6oreach Para e4ecutar cada lin1a de uma matri, ou de outra estrutura com "ormato de lista (como lin1as
em um arquivo), Perl usa a estrutura "oreac1% 3la tem o seguinte "ormatoF
foreach $petisco (@comida) # visitar cada item e coloc-lo em $petisco
{
print "$petisco\n"; # exibe cada item
print "Yum yum\n"; # de @comida...
}
0s a$es a serem reali,adas cada ve,, esto no !loco entre c1aves% &a primeira passagem pelo !loco,
>petisco atri!u8do ao valor do primeiro item da matri, Qcomida% &a pr4ima ve,, ele atri!u8do ao
segundo valor, e assim por diante% Be Qcomida estiver va,io logo no in8cio, ento o !loco de
declara$es no ser+ e4ecutado%
Testan!o 0s pr4imas e poucas estruturas contam com os testes !ooleanos verdadeiro ou "also% 7
nGmero ,ero, sendo ,ero um caractere, e o caractere va,io ('') so contados como "alsos% 0qui esto
alguns testes em nGmeros e stringsF
$a == $b # $a numericamente igual a $b? cuidado: no use s o operador = $a
!= $b $a numericamente diferente de $b?
$a eq $b # $a uma string igual a $b?
$a ne $b # $a uma string diferente de $b?
6oc# pode tam!m tentar usar operadores lgicos e, ou, noF
($a && $b) # $a e $b so verdadeiros?
($a || $b) # $a ou $b verdadeiro?
!($a) # $a falso?
6or Perl possui a estrutura "or que "unciona da mesma "orma que no C% 3le tem o "ormatoF
for (inicializar; testar; incrementar)
{
primeira_ao;
segunda_ao;
etc;
}
Primeiramente, a declarao iniciali,ar e4ecutada% 3nto, enquanto testar "or verdadeiro, o !loco de
a$es ser+ e4ecutado% 0ps cada passagem, a ve, de incrementar% 0qui est+ um e4emplo de loop
para mostrar os nGmeros de C a AF
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";
}
)hile e &ntil 0qui est+ um programa que l# do teclado e no continua at que a sen1a correta se*a
digitadaF
#!/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
}
7 !loco de cdigo entre c1aves e4ecutado enquanto a entrada no "or igual a sen1a% 0 estrutura 1ile
deve ser de "+cil compreenso, mas oportuno notar diversos detal1es%
Primeiro, ns podemos ler de uma entrada padro (teclado) sem precisar a!ri)la%
Begundo, quando a sen1a digitada, >a inclui o caractere neline no "inal (ao pressionar enterMreturn)% 0
"uno c1op remove o Gltimo caractere de uma string que neste caso o neline%
Para testar o oposto, ns podemos usar a declarao until do mesmo modo% 3ste e4ecuta o !loco
repetidamente at que a e4presso se*a verdadeira, e no enquanto ela verdadeira%
7utra tcnica Gtil, colocar o 1ile ou until no "inal do !loco de declara$es, em ve, de colocar no in8cio%
Isto requer a presena do operador do para marcar o in8cio do !loco e o teste no "inal%
&ovamente, o programa acima pode ento ser escrito desta "orma (note que o !loco ser+ e4ecutado pelo
menos uma ve,)F
#!/usr/local/bin/perl
do
{
print "Senha? "; # pede pela senha
$a = ; # l do teclado
chop $a; # remove o ltimo caractere, newline
}
while ($a ne "teste");
# repete enquanto a senha for errada
# usando until no lugar de while,
# until ($a eq "teste"); repete at que a senha esteja correta
$%erccio .odi"ique o programa do e4erc8cio anterior de modo que cada lin1a do arquivo se*a lida uma a
uma, e retorne com um nGmero de lin1a no in8cio% 6oc# deve ter algo comoF
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
Talve, se*a interessante usar esta estruturaF
while ($linha = ) # l cada linha at o final de INFO
{
...
}
Yuando voc# tiver "eito isso, ve*a se pode alter+)lo de modo que cada nGmero de lin1a se*a mostrada
como CC/, CC2, %%%, CCA, C/C, C//, C/2, etc%
Para "a,er isso, voc# dever+ somente mudar uma lin1a inserindo quatro caracteres e4tras% Eem!re)se
que o Perl permite isso%
Con!icionais
- claro que o Perl tam!m permite testes condicionais i"Mt1enMelse% 3les
possuem o seguinte "ormatoF
if ($a)
{
print "A varivel no est vazia\n";
}
else
{
print "A varivel est vazia\n";
}
Para entender, recorde que o caractere va,io considerado como
"also% 3le tam!m retorna "also se o caractere "or ,ero%
Tam!m poss8vel incluir mais alternativas em uma declarao
condicionalF
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";
}
&este caso, importante notar que a declarao elsi" est+ correta, sem
o e de elsei"%
34erc8cio
$%erccio 3ncontre um arquivo grande com algum te4to e algumas lin1as em !ranco%
Ho e4erc8cio anterior, voc# deve ter um programa que mostra o arquivo de sen1as com nGmeros de
lin1as% .ude ele de modo que "uncione com o outro arquivo de te4to%
0gora altere o programa de modo que aqueles nGmeros no se*am mostrados ou contados com lin1as
em !ranco, mas toda lin1a permanece sendo mostrada, incluindo as em !ranco% @ecorde que, quando
uma lin1a do arquivo lida, ela continua incluindo seu caractere neline no "inal%
Comparan!o strings (m dos mais Gteis recursos do Perl (seno o mais Gtil) a poderosa manipulao
de strings% &o corao desta, est+ a e4presso regular (3@) que compartil1ada por muitos outros
utilit+rios do (ni4%
34press$es regulares 0 vari+vel especial >? .ais so!re 3@s 0lguns e4emplos de 3@s 34erc8cio
$%press#es reg&lares (ma e4presso regular sempre est+ contida entre !arras, e a comparao
ocorre com o operador NU% 0 seguinte e4presso verdadeira se a string aparecer na vari+vel
>sentenaF
$sentenca =~ /para/
0 3@ case sensitive, de modo que seF
$sentenca = "Para as raposas";
ento a comparao resultar+ em "alsa% 7 operador 78 usado para o oposto, sendo assim o e4emploF
$sentenca !~ /para/
retorna verdadeiro porque a string no aparece em >sentena
A +ari+el especial 9: &s podemos usar uma condicional comoF
if ($sentenca =~ /sob/)
{
print "Ns estamos conversando\n";
}
que dever+ mostrar a mensagem se tivermos um dos seguintes valoresF
$sentenca = "Embaixo e sob";
$sentenca = " sobre o assunto...";
Porm mais "requentemente e muito mais "+cil se atri!uirmos a sentena R uma vari+vel especial 9:
(certamente escalar)%
Be ns "i,ermos isso, ento podemos evitar o uso dos operadores de comparao e o e4emplo acima
pode ser escrito comoF
if (/sob/)
{
print "Ns estamos conversando\n";
}
0 vari+vel 9: padro para muitas opera$es do Perl e tende a ser muito usado%
4ais so,re $Rs 3m uma 3@ e4iste uma grande quantidade de caracteres especiais, o que "a, com que
parea mais complicado% 7 mel1or modo de construir seus programas usando 3@s aos poucos%
0qui esto alguns caracteres especiais 3@ e seus signi"icadosF
. # qualquer caractere exceto newline
^ # o incio da linha ou do caractere
$ # o fim da linha ou do caractere
* # nenhum, um ou mais do ltimo caractere
+ # um ou mais do ltimo caractere
? # nenhum ou o ltimo caractere
e aqui alguns e4emplos de compara$es% @ecorde que seu uso sempre entre !arras%
p.r # p seguido por qualquer caractere seguido por e
# isto ir comparar:
# par
# para
# por
^f # f no incio da linha
^ftp # ftp no incio da linha
es$ # es no final da linha
und* # un seguido por nenhum ou vrios caracteres d
# isto ir comparar:
# un
# und
# undd
# unddd (etc)
.* # qualquer string sem o newline,
# isto ocorre porque o . compara qualquer caractere
# e o * o mesmo que nenhum ou mais deste caractere
^$ # uma linha vazia
34istem ainda mais op$es% Colc1etes podem ser usados para comparar qualquer um destes caracteres
dentro deles% 3ntre colc1etes, o s8m!olo ) indica entre e o s8m!olo Z no in8cio signi"ica noF
[qjk] # tanto q ou j ou k
[^qjk] # exceto q, j e k
[a-z] # qualquer um entre a e z, inclusive estes
[^a-z] # exceto letras minsculas
[a-zA-Z] # qualquer letra
[a-z]+ # qualquer sequncia com pelo menos uma ou mais letras minsculas
0s demais op$es servem mais para re"er#ncia%
(ma !arra vertical ; representa ou e os par#nteses podem ser usados para agrupar caracteresF
gelia|creme # tanto gelia ou creme
(ov|dad)os # tanto ovos ou dados
(da)+ # tanto da ou dada ou dadada
0qui esto mais alguns caracteres especiaisF
\n # um newline
\t # um tab
\w # qualquer caractere alfanumrico (palavra)
# o mesmo que [a-zA-Z0-9_]
\W # exceto caracteres alfanumricos,
# o mesmo que [^a-zA-Z0-9_]
\d # qualquer dgito
# o mesmo que [0-9]
\D # exceto dgitos, [^0-9]
\s # qualquer caractere em branco: espao,
# tab, newline, etc
\S # exceto caracteres em branco
\b # uma palavra limitada, fora de []
\B # nenhuma palavra limitada
3st+ claro que caracteres como 9< ;< =< 1< .< / so casos particulares em e4press$es regulares% Be voc#
quiser comparar um ou mais destes caracteres, ento deve sempre preced#)los de uma !arra invertidaF
\| # barra vertical
\[ # colchetes esquerdo
\) # parnteses direito
\* # asterisco
\^ # circunflexo
\/ # uma barra
\\ # barra invertida
Alg&ns e%emplos !e $Rs
Como "oi mencionado antes, o uso de e4press$es regulares deve
ocorrer aos poucos% 0qui esto alguns e4emplos% Eem!re)se sempre
de us+)los entre !arras M%%%M
[01] # tanto "0" ou "1"
\/0 # diviso por zero
\/ 0 # diviso por zero com um espao
\/\s0 # diviso por zero com um espao em branco
# "/ 0" onde o espao pode ser um tab, por exemplo
\/ *0 # diviso por zero com nenhum ou alguns espaos
# "/0" ou "/ 0" ou "/ 0" etc
\/\s+0 # diviso por zero com alguns espaos em
branco
\/\s+0\.0* # como o anterior, mas com ponto decimal
# e alguns zeros depois dele, ou no
# "/ 0." ou "/ 0.0" ou "/ 0.000" etc
# observe a barra invertida antes do ponto
$%erccios Beu programa anterior contava lin1as no)va,ias% 0ltere ele de modo que conte somente
lin1as comF
a letra 4 a string para a string para, sendo p maiGsculo ou minGsculo a palavra para ou Para, use ., para
detectar palavras limitadas com um espao em !ranco (neline, ta!, etc)
3m cada caso, o programa deve mostrar toda lin1a, mas somente as espec8"icas devem ser numeradas%
Tente usar a vari+vel 9: para evitar o uso do operador de comparao NU%
>&,stit&i"-o e tra!&"-o
(ma ve, identi"icadas as e4press$es regulares, Perl permite "a,er
su!stitui$es !aseadas naquelas compara$es%
7 modo de "a,er isso usando a "uno s que parecida com o modo
de su!stituio usado pelo editor de te4to vi do (ni4%
.ais uma ve, o operador de comparao usado, e mais uma ve, se
ele "or omitido ento a su!stituio utili,ar+ a vari+vel 9: em seu lugar%
Para su!stituir uma ocorr#ncia de londres por Eondres na >sentena
devemos usar a e4pressoF
$sentenca =~ s/londres/Londres/
e para "a,er o mesmo com a vari+vel 9: useF
s/londres/Londres/
&ote que as duas e4press$es regulares esto usando um total de tr#s
!arras% 7 resultado desta e4presso o nGmero de su!stitui$es
"eitas, de modo que pode ser tanto ,ero ("also) como um (verdadeiro),
no caso acima%
7p$es @ecordando modelos Traduo 34erc8cios
Op"#es
3ste e4emplo somente su!stitui a primeira ocorr#ncia da string, mas
pode ser que ten1a mais do que uma string que dese*amos su!stituir%
Para "a,er uma su!stituio glo!al, a Gltima !arra deve ser seguida por
um gF
s/londres/Londres/g
que o!viamente utili,a a vari+vel 9:% &ovamente a e4presso retorna o
nGmero de su!stitui$es reali,adas, que ,ero ou alguma coisa maior
que ,ero (verdadeiro)%
Be dese*armos tam!m su!stituir ocorr#ncias de l7ndres, lonH@3B,
Eo&Hr3B e assim por diante, ento podemos usarF
s/[Ll][Oo][Nn][Dd][Rr][Ee][Ss]/Londres/g
mas um modo mais "+cil usar a opo i (para ignorar letras
maiGsculas ou minGsculas)% 0 e4pressoF
s/londres/Londres/gi
"ar+ uma su!stituio glo!al no importando se "oi usado letras
maiGsculas ou minGsculas% 0 opo i tam!m pode ser usada em
e4press$es regulares !+sicas%
Recor!an!o mo!elos - "requentemente Gtil recordar modelos que tem sido comparados de modo que
eles possam ser usados novamente% Isto ocorre porque qualquer coisa comparada entre par#nteses
retorna nas vari+veis >/,%%%,>A% 3stas strings tam!m podem ser usadas da mesma "orma que nas
e4press$es regulares (ou su!stitui$es) utili,ando os cdigos especiais 3@ [/,%%%,[A%
3sse testeF
$_ = "Lorde Whopper de Fibbing";
s/([A-Z])/:\1:/g;
print "$_\n";
colocar+ cada letra maiGscula entre F (dois pontos)% &este e4emplo, mostrar+ FEForde FJF1opper de
FIFi!!ing% 0s vari+veis >/,%%%,>A so somente de leitura, voc# no pode alter+)las%
Como outro e4emplo, o testeF
if (/(\b.+\b) \1/)
{
print "Encontrou $1 repetida\n";
}
ir+ identi"icar qualquer palavra repetida% Cada ., representa uma palavra limitada e %\ compara qualquer
string no va,ia, ento .,('., compara qualquer coisa entre duas palavras limitadas%
7 resultado ento arma,enado como .0 para e4press$es regulares e como 90 para o resto do
programa%
Be 9: "or igual a 'teste teste teste2 teste2', a mensagem ser+ mostrada, mas somente com a primeira
ocorr#ncia%
7 seguinte e4emplo troca o primeiro e Gltimo caracteres da lin1a na vari+vel 9:F
s/^(.)(.*)(.)$/\3\2\1/
7 Z e o 9 comparam o in8cio e o "im da lin1a% 7 cdigo .0 arma,ena o primeiro caractere, o .2 arma,ena
cada string entre os dois e o Gltimo caractere arma,enado no cdigo .?% 3nto aquela lin1a
su!stitu8da com a troca entre .0 e .?%
0ps uma comparao, voc# pode usar vari+veis especiais somente de leitura 9@ ou 9A ou 9B para
encontrar o que "oi comparado antes, durante e depois da !usca% 3ntoF
$_ = "Lorde Whopper de Fibbing";
/pp/;
resultar+ em verdadeiro nas seguintes declara$es (recorde que eq um teste usado em strings)F
$` eq "Lorde Who";
$& eq "pp";
$' eq "er de Fibbing";
Iinalmente, so!re o tpico @ecordando modelos, o importante sa!er que dentro de !arras de uma
comparao ou su!stituio, as vari+veis so interpoladas% 3ntoF
$busca = "par";
s/$busca/xxx/g;
ir+ su!stituir cada ocorr#ncia com 444% Be voc# quiser su!stituir cada ocorr#ncia de para ento voc# no
pode usar s/9,&scaa/%%%/g porque o a ser+ interpolado com a vari+vel >!usca% 0o invs disso, voc#
deve colocar o nome da vari+vel entre c1aves, de modo que o cdigo se*aF
$busca = "par";
s/${busca}a/xxx/g;
Tra!&"-o 0 "uno tr permite a traduo caractere)a)caractere% 0 seguinte e4presso su!stitui cada a
com e, cada ! com d, cada c com " na vari+vel >sentena% 0 e4presso retorna o nGmero de
su!stitui$es e"etuadasF
$sentenca =~ tr/abc/edf/
0 maioria dos cdigos especiais 3@ no se aplica R "uno tr% Por e4emplo, a pr4ima declarao conta
o nGmero de asteriscos na vari+vel >sentena e arma,ena na vari+vel >contagemF
$contagem = ($sentenca =~ tr/*/*/);
Contudo, o trao permanece como seu uso entre% 3sta declarao converte toda >? para letra maiGsculaF
tr/a-z/A-Z/;
$%erccios
Beu Gltimo programa contava lin1as de um arquivo que contin1am uma
certa string%
.odi"ique ele de modo que conte lin1as com letras duplas (ou qualquer
outro caractere duplo)%
.odi"ique novamente para que estas letras duplas apaream entre
par#nteses% Por e4emplo, seu programa deve produ,ir algo comoF
023 E(ss)es pioneiros conduziram muitas se(ss)es
Tente "a,er com que todos os pares de letras se*am colocados entre
par#nteses, e no apenas o primeiro par de cada lin1a%
Para um programa mais interessante, voc# deve tentar o seguinte%
Bupon1a que seu programa se c1ama contalin1as% 3nto voc# deve
e4ecut+)lo comF
perl contalinhas
Contudo, se voc# c1am+)lo com v+rios argumentos, como emF
perl contalinhas primeiro segundo etc
ento estes argumentos sero arma,enados em uma matri, CARG*%
&o e4emplo acima, ns teremos 9ARG*=DE igual a primeiro, 9ARG*=0E
igual a segundo e 9ARG*=2E igual a etc%
.odi"ique seu programa de modo que ele aceite uma string como
argumento e conte somente lin1as com essa string% 3le deve tam!m
colocar ocorr#ncias dela entre par#nteses% 3ntoF
perl contalinhas par
dever+ retornar algo comoF
019 Mas (par)a os grandes pioneiros, suas (par)tes
eram...
>plit (ma "uno muito Gtil no Perl a split, que separa uma string e coloca em uma matri,% 0 "uno
usa e4press$es regulares e tam!m "unciona com a vari+vel especial >?%
0 "uno split usada desta "ormaF
$info = "Caine:Michael:Ator:Doce Liberdade";
@pessoal = split(/:/, $info);
que tem o mesmo e"eito queF
@pessoal = ("Caine", "Michael", "Ator", "Doce Liberdade");
Be a in"ormao estiver arma,enada na vari+vel >? ento poderemos usar somenteF
@pessoal = split(/:/);
Be os campos so divididos por v+rios dois pontos, ento podemos usar os cdigos 3@ para certos
pro!lemas% 7 cdigoF $_ = "Caine::Michael:::Ator";
@pessoal = split(/:+/);
o mesmo queF
@pessoal = ("Caine", "Michael", "Ator");
mas se no "or usado, entoF
$_ = "Caine::Michael:::Ator";
@pessoal = split(/:/);
ser+ o mesmo queF
@pessoal = ("Caine", "", "Michael", "", "", "Ator"); (ma palavra pode ser separada
em caracteres, uma sentena separada em palavras e um par+gra"o em sentenasF
@caracteres = split(//, $palavra);
@palavras = split(/ /, $sentenca);
@sentencas = split(/\./, $paragrafo);
&o primeiro caso, a string nula comparada entre cada caractere, e isso ocorre porque Qcaracteres
uma matri, de caracteres, i%, uma matri, de strings com comprimento /%
34erc8cios
$%erccios (ma "erramenta Gtil no processamento de nossa l8ngua natural a concordDncia% 3ste
permite que uma string espec8"ica se*a mostrada em seu conte4to imediato, em qualquer lugar que
aparea no te4to%
Por e4emplo, um programa de concordDncia identi"icando a string destino par talve, possa produ,ir
alguma das seguintes sa8das% &ote como as ocorr#ncias da string destino se alin1am verticalmenteF
o primeiro par !e liga"#es ocorre&
sen!o 5&e para enten!er os pro,le
no seg&n!o par e%iste a possi,ili!
s o Fltimo par !e+e conter a 6inal
&este e4erc8cio, voc# deve "a,er esse programa% 0qui esto algumas dicasF
coloque o arquivo inteiro em uma matri, (geralmente isso no Gtil porque o arquivo pode ser
e4tremamente grande, mas no devemos nos preocupar com isso agora)% Cada item na matri, ser+ uma
lin1a do arquivo% quando a "uno c1op usada em uma matri,, ela elimina o Gltimo caractere de cada
item da matri,% recorde que voc# pode *untar a matri, inteira com uma declarao como 9te%to G
HClinhasHP use a string destino como delimitador para separar o te4to (i%, use a string no lugar dos dois
pontos usados nos e4emplos anteriores)% 6oc# deve ento ter uma matri, de todas as strings entre cada
string destino% para cada elemento da matri,, mostre ele, a string destino, e ento mostre o pr4imo
elemento da matri,% recorde que o Gltimo elemento de uma matri, Qcomida tem 8ndice >]comida%
3ste deveria ser um !om programa, mas a string destino no se alin1ar+ verticalmente% Para alin1ar
essas strings, voc# precisar+ da "uno su!str% 0qui esto tr#s e4emplos de seu usoF
substr("Era uma vez a...", 3, 4); # retorna " uma"
substr("Era uma vez a...", 7); # retorna " vez a..."
substr("Era uma vez a...", -6, 5); # retorna "z a.."
7 primeiro e4emplo retorna uma su!string de comprimento 9 comeando a partir da posio 5% @ecorde
que o primeiro caractere de uma string tem 8ndice ,ero% &o segundo e4emplo, se "altar o comprimento,
toda a su!string a partir da posio < mostrada% 7 terceiro e4emplo mostra que voc# tam!m pode
contar a partir do "inal, usando um 8ndice negativo% 3le retorna a su!string que comea a partir do se4to
caractere contado da direita para a esquerda com comprimento de : caracteres%
Be voc# usar um 8ndice negativo que estende alm do comeo da string, ento o Perl retornar+ nada ou
uma mensagem de erro% Para evitar que isso ocorra, voc# pode aumentar o taman1o da string usando o
operador 4, como mencionado antes% Por e4emplo, a e4presso /H H%?D1 produ, 5C espaos%
4atri3es associati+as (ma lista comum de matri, permite acessar seus elementos atravs de nGmeros%
7 primeiro elemento da matri, Qcomida >comida^C_% 7 segundo >comida^/_, assim por diante, sendo
que o Gltimo elemento >comida^>]comida_%
.as o Perl tam!m permite criar matri,es que so acessadas por uma string% 3stas so c1amadas de
matri,es associativas%
Para de"inir uma matri, associativa, usamos a notao usual com par#nteses, mas a matri, agora
pre"i4ada por um sinal `% Bupon1a que ns queremos criar uma matri, de pessoas com suas idades% 3la
pode ser algo comoF
%idades = ("Michael Caine", 39,
"Den", 34,
"Angie", 27,
"Willy", "21 anos de cachorro",
"A rainha me", 108);
0gora podemos encontrar a idade de cada pessoa com as seguintes e4press$esF
$idade{"Michael Caine"}; # Retorna 39
$idade{"Den"}; # Retorna 34
$idade{"Angie"}; # Retorna 27
$idade{"Willy"}; # Retorna "21 anos de cachorro"
$idade{"A rainha me"}; # Retorna 108
&ote que como na matri, comum, cada sinal ` "oi alterado para um > para acessar um elemento
individual porque cada elemento escalar% .as, de "orma di"erente da lista comum, onde o 8ndice
colocado entre par#nteses, a idia est+ em "acilitar o acesso atravs da associao de cada par de
elementos%
(ma matri, associativa pode ser convertida em uma comum apenas atri!uindo ela a uma vari+vel Q, e
vice)versa% &ote porm que a converso no coloca os elementos pares em ordem, como veremos
adianteP
@info = %idades; # @info uma lista comum. Ela tem agora 10 elementos
$info[5]; # retorna o valor 27
%maisidades = @info; # %maisidades tem agora 5 pares de elementos
7peradores 6ariavis de 0m!iente
Opera!ores .atri,es associativas no ordenam seus elementos (elas so como grandes ta!elas
con"usas) mas poss8vel acessar todos seus elementos usando "un$es de c1aves e "un$es de
valoresF
foreach $pessoa (keys %idades)
{
print "Eu sei a idade de $pessoa\n";
}
foreach $idade (values %idades)
{
print "Algum tem $idade\n";
}
Yuando aeSs c1amada, ela retorna uma lista de 8ndices da matri, associativa% Yuando values
c1amada, ela retorna uma lista dos valores da matri,% 3ssas "un$es retornam suas listas na mesma
ordem, mas esta ordem no tem nada a ver com a ordem em que os elementos "oram inseridos%
Yuando aeSs e values so c1amadas em um conte4to escalar, elas retornam o nGmero de pares na
matri, associativa%
34iste tam!m um "uno que retorna uma lista de dois elementos de uma c1ave e seu valor% Cada ve,
que c1amada, ela retorna outro par de elementosF
while (($pessoa, $idade) = each(%idades))
{
print "$pessoa tem $idade\n";
}
*aria+Iis !e Am,iente Yuando voc# roda um programa em Perl, ou qualquer script no (ni4, certas
vari+veis de am!ientes so setadas% 0lgumas podem ser como 9$N*JBU>$RBK que contm o username
(nome do usu+rio logado)%
Yuando voc# roda um script CGI na JJJ, e4istem vari+veis de am!iente que possuem outras
in"orma$es Gteis% Todas essas vari+veis e seus valores so arma,enados na matri, associativa L$N*
em que as c1aves so os nomes das vari+veis% 7 seguinte e4emplo retorna todas as suas vari+veis de
am!ienteF
while (($chave, $valor) = each(%ENV))
{
print "$chave igual a $valor\n";
}
>&,rotinas Como qualquer linguagem estruturada, Perl permite ao usu+rio de"inir suas prprias "un$es,
c1amadas su!rotinas% 3las podem ser colocadas em qualquer lugar do programa, mas o ideal coloc+)
las no in8cio, ou tudo no "inal% (ma su!rotina tem sempre o "ormatoF
sub subrotina
{
print "Esta uma rotina muito simples.\n";
print "Ela sempre faz a mesma coisa...\n";
}
0s seguintes declara$es servem para c1amar a su!rotina% &ote que ela invocada com um caractere b
na "rente do nomeF
&subrotina; # chama a subrotina
&subrotina($_); # chama ela com um parmetro
&subrotina(1+2, $_); # chama com dois parmetros
ParDmetros @etornado 6alores 6ari+veis Eocais
ParMmetros
&os casos acima, os parDmetros so aceitos porm ignorados% Yuando
a su!rotina c1amada, os parDmetros so passados como uma lista
na vari+vel especial Q?% 3sta vari+vel no tem nada a ver com a
vari+vel escalar >?% 0 seguinte su!rotina simplesmente mostra a lista
de argumentos passadosF
sub argumentos
{
print "@_\n";
}
0lguns e4emplos de seu usoF
&argumentos("primeiro", "segundo"); # mostra primeiro
segundo
&argumentos("mas", "e", "uvas"); # mostra mas e
uvas
Como em qualquer outra matri, comum, os elementos individuais de
Q? podem ser acessados com a notao entre colc1etesF
sub primeiros
{
print "Primeiro argumento: $_[0]\n";
print "Segundo argumento: $_[1]\n";
}
&ovamente importante recordar que as vari+veis escalares inde4adas
9:=DE< 9:=0E, etc no t#m nada a ver com a vari+vel >?, que pode ser
usado normalmente sem causar pro!lemas%
Retornan!o +alores
7 resultado de uma su!rotina sempre a Gltima coisa a se reali,ar%
3sta su!rotina retorna o maior valorF
sub maior
{
if ($_[0] > $_[1])
{
$_[0];
}
else
{
$_[1];
}
}
&este e4emplo, >maior ser+ igual a 5<F
$maiorvalor = &maior(37, 24);
0 su!rotina bprimeiros tam!m retorna um valor, que neste caso /%
Isto ocorre porque a Gltima coisa que aconteceu "oi a e4ecuo da
"uno print, e quando essa declarao "unciona corretamente, ela
resulta em /%
*ari+eis locais 0 vari+vel Q? local somente para a corrente su!rotina, e assim so as demais, como
9:=DE< 9:=0E, etc% 7utras vari+veis tam!m podem ser locais, e isto Gtil se quisermos comear alterando
os parDmetros passados% 0 seguinte su!rotina veri"ica se uma string est+ dentro de outra, comparando
sem os espaos entre as palavrasF
sub dentro
{
local($a, $b); # cria variveis locais
($a, $b) = ($_[0], $_[1]); # atribui valores
$a =~ s/ //g; # retira espaos das
$b =~ s/ //g; # variveis locais
($a =~ /$b/ || $b =~ /$a/); # $b est dentro de $a,
# ou $b contm $a?
}
0 seguinte e4presso retorna verdadeiroF
&dentro("mamo", "lima mo");
He "ato, voc# tam!m pode eliminar redundDncias su!stituindo as duas primeiras declara$es do !loco
pela lin1aF
local($a, $b) = ($_[0], $_[1]);

Potrebbero piacerti anche