Perl 1
Perl 1
PHP, ASP e outras coisas, várias pessoas tem me perguntado: Para que serve
o Perl, afinal? Tenho escutado comentários sobre a obsolescência da
linguagem frente a estas outras, muito mais modernas (será mesmo?).
Talvez seja verdade que para algumas aplicações não seja preciso usar o Perl.
Mas sem dúvida todas as coisas que se faz com outras linguagens poderiam
ser feitas usando Perl, talvez com mais poder, versatilidade e facilidade. No
lado do servidor, códigos incrustados no documento em HTML, tipo PHP ou
ASP podem ser implementados com o módulo do Apache mod_perl. No lado
do cliente, com funções muito parecidas com o javascript o vbscript há o
perlscript, um plugin para navegadores como Netscape e Explorer. E como o
Perl é uma linguagem de uso geral, aplicações para desktop, softwares de
produtividade, gerenciadores de bancos de dados, interfaces gráficas,
programação de sockets, clientes e servidores para Internet, CGI, etc. podem
ser desenvolvidos rapidamente.
Usos do Perl
Internet
Administração de servidores
Software em geral
Bancos de Dados
Linux
Exemplo:
#!/usr/bin/Perl
2 − Mude a permissão do script para que possa ser executado pelo usuário
corrente:
>chmod +x ./oi_turma
Um uso muito útil para o perl seria trocar todas as ocorrências de um texto por
outro, em determinados arquivos, salvando um backup destes.
Isto pode ser uma solução fantástica se você precisar consertar um link
quebrado, presente em centenas de arquivos.
Fundamentos da linguagem
Entretanto quem não tem experiência em UNIX ou sed, awk e shell poderá
encontrar alguma dificuldade com a assimilação de alguns poderosos recursos.
Notação
Print
" Oi, turma!
"
;
Blocos
do {
print "Oi, turma!\n";
}
print "Oi, de novo";
Tipos
Escalares:
Precedidos por um cifrão ($), exemplo: $escalar.
$numero = 5;
print "Digite um numero:"
$input=getc();
$soma = $numero + $input;
$string = "Valores:\n numero digitado: $input\n a somar com:$numero
\nsoma:$soma\n;"
Números
Inteiros, precisão dupla, com ou sem sinal, notação científica, decimal, hexa,
octal, binário.
Strings
Sequências de caracteres. Em sua forma literal devem ser delimitadas por
aspas simples (’) ou duplas ("). Strings delimitadas por aspas duplas podem
conter variáveis interpoladas ou caracteres especiais, usando a barra de
escape. Exemplo:
$variavel= "Cyber";
$aspas_simples = ’Interatividade?\nChame o $variavel.’;
$aspas_duplas = "Interatividade?\nChame o $variavel.";
print $aspas_simples;
print "\n−−−−−−−−−−−−−−−\n";
print $aspas_duplas, "\n";
Interatividade?\nChame o $variavel.
Interatividade?
Chame o Cyber
Repare que o último comando "print" usa uma vírgula para separar os seus
dois argumentos: o escalar $aspas_duplas e o string literal "\n". Se for preciso,
entretanto, colocar uma aspa simples numa string delimitada por aspas
simples, será necessário usar um escape antes desta (\’).
Referências
Arrays
Listas
São coleções de escalares. Listas de literais ou variáveis podem ser
construídas com os elementos separados por vírgulas e envolvidos por
parênteses. Listas podem ser atribuídas a arrays ou a listas de variáveis.
Exemplo:
@Agora = gmtime;
($dia,$mes,$ano..)=@Agora;
Acessando os elementos do array usando o indice numérico:
print $Agora(0);
$tamanho=@Agora;
print $tamanho;
Hashs
São coleções de escalares referenciados por uma chave definida como outro
escalar (string). São precedidos pelo sinal de percentagem (%).
Exemplo: %Hash
keys %Hash=(fruta,massa,liquido);
values %Hash=("pera", "lazanha", "vinho");
%Hash=(
fruta=>pera,
massa=>lazanha,
liquido=>vinho
);
Ou ainda:
%Hash=(fruta,pera,massa,lazanha,liquido,vinho);
Exemplo:
print $Hash{"fruta");
O prompt aparecerá logo após a palavra pera porque não incluimos o caracter
"\n".
Controle de fluxo
O Perl usa as mesmas palavras reservadas que o C para o controle dos blocos
de programa e algumas proprias, como foreach.
if elsif
:Fim print "Isto também será impresso\n";
Variáveis especiais
O perl usa uma série de variáveis especiais que facilitam e otimizam o código. As mais
importante são $_ e @_ que sempre se referem ao ultimo valor processado.
Exemplo:
O sinal refere−se ao conteúdo do arquivo cujo handle é FOO. Se for usado <> será
acessado o conteúdo de STDIN
O algoritmo abaixo le as entradas do console, até encontrar um final de arquivo (control
D) acumulando no string foo:
while (<>) {
$foo .=$_;
Para assuntos mais aprofundados sobre abertura e fechamento de arquivos, é bom ler
o tutorial sobre arquivos, usando o man, do GNU/Linux.
/>man perlopentut
Subrotinas
Exemplo:
# O comando abaixo imprimirá "Oi, Turma!!"
&oiturma;
sub oiturma {
print "Oi, Turma!!\n\n";
}
A subrotina retornara o valor de $_ ou @_, o ultimo a ser alterado, a menos que exista
o comando "return";
print $oi,&oiturma;
sub oiturma {
$oi="Oi, ";
return "Turma!!");
}
Bibliotecas
Podem ser carregadas bibliotecas com o comando "requer". Bibliotecas são arquivos
contendo sub rotinas. O valor de retorno de um script biblioteca precisa ser 1.
HTTP/1.0 200 OK
Date: Thursday, 28−June−96 11:12:21 GMT
Server: NCSA/1.4.2
Content−type: text/html
Content−length: 2041
Variáveis de ambiente
A CGI usa as variáveis de ambiente na transação de pedido e envio de arquivos para
controlar e processar algoritmos.
Temos acesso a dados do cliente que fez o pedido e a detalhes deste pedido, pode−se
lidar com os protocolos de autorização, "Mime Types", cookies. Não pretendemos aqui
neste trabalho aprofundar o estudo da CGI, apenas pretendemos exemplificar o uso do
Perl.
SERVER_SOFTWARE: Apache/1.2.4
GATEWAY_INTERFACE: CGI/1.1
DOCUMENT_ROOT: /home/httpd/html/gallerie/html/
Lendo um <form>
Podemos chamar um script Perl de dentro de uma página HTML que contém um
O meu Apache está configurado para rodar scripts no diretório /cgi−bin/ que aponta
para o diretório real, na máquina: /home/httpd/cgi−bin/
O script abaixo deve ser salvo no diretório /home/httpd/cgi−bin/ e deve Ter permissão
para executar:
/> chmod 744 ./getenv
Note que foi usada a biblioteca cgi−lib.pl e sua rotina &ReadParse, que coloca a string
"Query" (aqui escondida pelo método post) no array @in:
#!/usr/bin/perl
# getenv
require "cgi−lib.pl";
&ReadParse;
Gerando a tela:
Módulo CGI
Poderíamos escrever o mesmo programa com o módulo CGI, gerando a saída em html.
Para um aprofundamento na questão digite:
/>perldoc CGI
Abaixo o novo script getenv:
#!/usr/bin/perl
# getenv
use CGI;
$tela=CGI::new();
print (
$tela−>header,
$tela−>start_html ( −title=>"Variaveis de Ambiente"),
$tela−>p("Variaveis:");
$tela−>dump
);
foreach $var (keys %ENV) {
print "<p>$var: $ENV{$var}\n";
}
print $tela−>end_html;
Podemos ligar um arquivo com dados do tipo nome:valor a um arquivo Hash. Bancos
de dados simples podem ser desenvolvidos desta forma
Devemos usar o comando "tie" para fazer a ligação. Exemplo:
#!/usr/bin/Perl
# telefones
use DB_File;
$caderno= tie %TEL, "DB_File", "/home/ricardo/telefones.txt";
while (TRUE){ # criando um loop:
# Menu
system("clear");
print "−−−−−−−−−−−−−− Agenda de Telefones −−−−−−−−−−−−−−−−\n";
$lido=&Digitado("Entre com o comando: [A] Incluir [M] Mostrar Lista [S] Sair:", c);
if ($lido eq "A"){&Incluir;}
elsif ($lido eq "M"){&Mostrar;}
elsif ($lido eq "S"){&Sair;} } # fechando o loop
sub Digitado {
my $xx, $tx;
$tx="";
print $_[0], "\n";
while ($lendo ne 1){$xx=getc; if ($xx eq "\n"){$lendo=1;}else{$tx.=$xx;} }
$lendo=0;
print "−−−−−−−−−−−−−−−−−−−−−−−−−−> Foi lido: $tx\n";
return $tx;}
sub Incluir {
$nome=&Digitado ("Nome a incluir: ");
$tel=&Digitado("Telefone: ");
$caderno−>put($nome, $tel);}
sub Mostrar {
foreach $nome(keys %TEL){
print "Nome: $nome\n";
print "Telefone: $TEL{$nome}\n−−−−−−−−−−−−\n";}
&Digitado("Tecle enter para continuar");
}
sub Sair {exit(0);}
/>perldoc DB_File
Bancos de dados mais complexos devem usar o módulo DBI, que servirá de interface
com servidores SQL, como mSQL, MySQL, Oracle, postgres, etc.
Interface gráfica
/>perldoc Tk
O Perl/Tk é usado para criar uma interface gráfica para os programas em Perl. Com
este módulo torna−se muito fácil a criação de janelas, botões, scrolls, canvas, caixas
de texto, etc.
Olha o programa "oiturma" com uma interface gráfica:
#/usr/bin/Perl
use Tk;
$janela=MainWindow−>new;
$janela−>Button(
−text=>"Oi, Turma!!",
−command=>sub{exit})−>pack;
MainLoop;
Aqui é importante lembrar que a interface só será desenhada na tela depois do
comando "MainLoop". O método "pack" é responsável pela formatação e
posicionamento dos dispositivos na janela. Existem ainda mais dois gerenciadores de
geometria: grid e place.
Exemplo:
#/usr/bin/Perl
use Tk;
$janela=MainWindow−>new;
$janela−>Button(
−text=>"Oi, Turma!!",
−command=>\&Sair)−>pack;
MainLoop;
sub Sair {
exit;
}