Introdução à linguagem Perl*

Instrutor: Er Galvão Abbott

* O uso da imagem de um camelo associado à Perl é marca registrada da O'Reilly Media, Inc. Usado com permissão.

Convenções utilizadas neste documento:

• Código-fonte é representado na cor azul, inclusive quando em comentários do instrutor.

• Resultados comentados pelo instrutor são representados em verde para que haja distinção clara da demonstração sem a necessidade de outros recursos que podem gerar confusão com o aprendizado, como aspas e parênteses, por exemplo.

• Observações especiais são representadas por um número entre parênteses na cor laranja que deve ser consultado no final de cada seção.

• Representações do prompt do SO são feitas em azul e iniciam pelo sinal de maior (>).

• Notas são representadas em um box destacado marcado com um bullet amarelo:

• Programas completos são representados em um box destacado marcado com um bullet azul:

• Dicas são representadas em um box destacado marcado com um bullet verde:

Um pouco de História:

Perl é uma linguagem que foi criada em 1987 por Larry Wall. Suas principais influências residem nas linguagens sh, awk, C e sed.

Perl se tornou extremamente popular nos primórdios da Internet, tornando-se a linguagem mais popular (juntamente com a linguagem C) para o desenvolvimento de scripts CGI. Estes scripts eram particularmente utilizados para o envio de informações digitadas pelos usuários em formulários colocados em websites.

Nota:
É comum confundir-se "Scripts Perl" com "Scripts CGI". CGI é meramente um padrão para a execução de aplicativos externos através de um servidor HTTP. Perl não é sinônimo de CGI!

Hoje em dia a linguagem é utilizada especialmente em empresas de telefonia, na área de bioinformática e universidades, devido à sua caraterística mais famosa: ser extremamente poderosa em tarefas que envolvam a manipulação de strings.

Perl também teve sua cota de "filhas". Entre as linguagens declaradamente influenciadas por ela encontram-se Ruby e PHP.

Estruturas de dados:

Perl lida basicamente com 3 estruturas básicas de dados:

• Scalars ou variáveis

• Arrays ou matrizes

• Hashes ou matrizes associativas

Detalharemos a seguir as características de cada uma destas estruturas:

Variáveis (Scalars):

Scalars são o tipo de estrutura de dados mais simples. Elas podem representar um número (inteiro, de ponto flutuante, etc...), uma string de texto, o retorno de uma função, etc...

Em Perl variáveis são representadas pelo sinal de $ (dólar) e, assim como em outras linguagens, deve seguir estas regras básicas de nomenclatura(1):

• Nomes de variáveis sempre devem ser iniciados com uma letra.

• Só podem conter outras letras, números ou o caractere especial underscore (_), contanto que a regra acima seja respeitada.

Exemplos de variáveis:

$inteiro = 1;

$flutuante = 0.5;

$texto = “Olá”;

$texto2 = 'Olá';

Nota:
No caso de strings o valor da variável deve ser contido entre aspas simples ou duplas, enquanto que valores numéricos devem ser declarados sem aspas. No caso de uma declaração do tipo: $teste = “5”; Perl tratará este valor como uma string, e não como um número.

A diferença entre o uso das aspas está na forma como Perl tratará a variável. No caso de aspas duplas, o interpretador da linguagem automaticamente converterá a variável para o seu valor (interpolação(2)), enquanto que com aspas simples isto não ocorre. Veja os exemplos:

$parte1 = 'Aprendendo';

$parte2 = “a linguagem Perl”;

$texto = “$parte1 $parte2”;

$texto2 = '$parte1 $parte2';

$texto agora contém a string de texto Aprendendo a linguagem Perl, enquanto que $texto2 contém $parte1 $parte2

(1): As regras de nomenclatura para todas as estruturas de dados não se aplicam às variáveis especiais de Perl. Veremos a variável especial $_ mais a seguir.

(2): A interpolação vale tanto para variáveis quanto para caracteres especiais, como, por exemplo, a nova linha (\n).

Matrizes (Arrays):

Arrays são um tipo de dado composto, ou seja, podem ser entendidos como um conjunto de Scalars concentrados em uma única denominação. Podem conter strings, números ou ambos e seus valores – contidos em parênteses - são acessados por seu índice (posição dentro da matriz).

Em Perl as matrizes são representadas pelo sinal de arroba (@) e seguem as mesmas regras de nomenclatura das variáveis.

Exemplos de matrizes:

@tipos_de_dados = ('Scalars', 'Arrays', 'Hashes');

@numeros_impares = (1, 3, 5);

@dados_diversos = ('Porto Alegre', 25.30, 3, 'Teste', 'São Leopoldo', 123.25, 'Unisinos');

Para se acessar apenas um elemento de uma matriz, deve se utilizar o nome da matriz no formato Scalar, seguido por sua posição entre colchetes ([]).

Veja os exemplos a seguir, onde misturaremos variáveis e matrizes para que possamos atribuir a uma variável o valor de um dos elementos de uma matriz:

$primeiro_tipo_de_dado = $tipos_de_dados[0];

$segundo_numero_impar = $numeros_impares[1];

$terceiro_dado_diverso = $dados_diversos[2];

Nota:
Ao contrário do uso coloquial, a primeira posição de uma matriz em Perl, por default, é sempre representada pelo índice zero (0).

Nos exemplos citados a variável $primeiro_tipo_de_dado conterá como valor a string Scalars, enquanto que a variável $segundo_numero_impar conterá o número 3 e a variável $terceiro_dado_diverso por sua vez terá como valor o número 3.

Entendendo melhor as matrizes:

Para que não haja dúvidas veja como seria a representação das matrizes utilizadas nestes items nas tabelas abaixo:

Matriz tipos_de_dados
Índice	0	1	2
Valor	Scalars	Arrays	Hashes

Table 1 Representação da matriz tipos_de_dados

Matriz numeros_impares
Índice	0	1	2
Valor	1	3	5

Table 2 Representação da matriz numeros_impares

Matriz dados_diversos
Índice	0	1	2	3	4	5	6
Valor	Porto Alegre	25.30	3	Teste	São Leopoldo	123.25	Unisinos

Table 3 Representação da matriz dados_diversos

Matrizes Associativas (Hashes)

Hashes são tipos de dados compostos como as matrizes, com a diferença básica de que seus índices devem ser explicitamente nomeados.

Nota:
Ao contrário dos arrays, hashes não são implicitamente ordenados, ou seja não existe o conceito de primeiro ou último elemento.

Em Perl as matrizes associativas são representadas pelo sinal de porcentagem (%) e (sim, você adivinhou) seguem as mesmas regras de nomenclatura das variáveis.

Exemplos de Matrizes Associativas:

%dias_da_semana = (

“Dom” => “Domingo”,

“Seg” => “Segunda”,

“Ter” => “Terça”,

“Qua” => “Quarta”,

“Qui” => “Quinta”,

“Sex” => “Sexta”,

“Sáb” => “Sábado”

);

%numeros = (

1 => “inteiro”,

0.25 => “ponto flutuante”,

3 => “ímpar”

);

%drive_c = (“label”, “meu_drive”, “tamanho(Kb)”, 40000000);

Nota:
As duas formas de notação de hashes são corretas, embora a notação por associação através do operador => seja preferida pela clareza e legibilidade de código. Sendo assim, a notação de nosso terceiro hash ficaria na seguinte forma: %drive_c = ( “label” => “meu_drive”, “tamanho(Kb)” => 40000000 );

Para se acessar apenas um elemento de uma matriz associativa, deve se utilizar o nome da matriz no formato Scalar, seguido pelo seu índice entre chaves ({}).

Veja os exemplos a seguir, onde misturaremos variáveis e matrizes associativas para que possamos atribuir a uma variável o valor de um dos elementos de uma matriz associativa:

$festa = $dias_da_semana{“Sáb”};

$ressaca = $dias_da_semana{“Dom”};

$checagem_inteiro = $numeros{1};

$tamanho = $drive_c{“tamanho(Kb)”};

Nos exemplos citados a variável $festa conterá como valor a string Sábado, enquanto que a variável $ressaca conterá a string Domingo, $checagem_inteiro conterá a string inteiro e a variável $tamanho por sua vez terá como valor o número 40000000.

Entendendo melhor as matrizes associativas:

Para que não haja dúvidas veja como seria a representação das matrizes associativas utilizadas nestes items nas tabelas abaixo:

Matriz dias_da_semana
Índice	Dom	Seg	Ter	Qua	Qui	Sex	Sáb
Valor	Domingo	Segunda	Terça	Quarta	Quinta	Sexta	Sábado

Table 4 Representação da matriz dias_da_semana

Matriz numeros
Índice	1	0.25	3
Valor	inteiro	ponto flutuante	ímpar

Table 5 Representação da matriz numeros

Matriz drive_c
Índice	label	tamanho(Kb)
Valor	meu_drive	40000000

Table 6 Representação da matriz drive_c

Executando um programa Perl:

Os programas Perl geralmente possuem a extensão .pl e esta será a extensão utilizada neste curso. É prática comum em scripts CGI a utilização da extensão .cgi e normalmente o servidor web está automaticamente pré-configurado para aceitar tanto uma quanto a outra.

São necessárias para a execução de um programa Perl:

Uma máquina com o interpretador da linguagem instalado.

Apenas para máquinas Unix: a primeira linha do programa deve apontar para o caminho

onde o interpretador foi instalado.

Esta primeira linha é conhecida como shebang. A shebang tem o seguinte formato:

#!/caminho/para/perl

Na maioria das instalações Unix a shebang tem a seguinte forma:

#!/usr/bin/perl

Nota:
Em máquinas Unix a ausência da shebang ocasionará um erro – a não ser que o programa seja executado pelo prompt - enquanto que em máquinas windows a presença ou ausência desta linha não faz diferença para a execução do programa. Sendo assim, por questões de portabilidade, é prática comum sempre utilizar a shebang.

Para executar um programa Perl, digite no prompt do SO:

>perl nome_do_programa.pl

Uma variação comum da shebang é utilizar o parâmetro -w. Este parâmetro habilita os warnings, avisos sobre possíveis erros no código-fonte do programa:

#!/usr/bin/perl -w

Isto seria o equivalente a executarmos o nosso programa da seguinte forma:

>perl -w nome_do_programa.pl

Nota:
Em 99% dos casos o interpretador Perl já está presente no PATH do SO, mas caso você encontre uma exceção, deverá usar o caminho completo, como por exemplo: >/usr/bin/perl nome_do_programa.pl

Comandos mais comuns:

A seguir veremos alguns dos comandos mais utilizados na linguagem Perl.

Comandos de saída de dados:

print

print FILEHANDLE LIST(3)

ou

print LIST

print é o comando Perl para saída de dados, seja para a tela ou para gravação em um arquivo. Vejamos agora como fica o programa-exemplo mais velho do mundo em Perl:

Programa 1: Olá mundo!
1 2 3 4 5	#!/usr/bin/perl $texto = 'Olá mundo!'; print "\n$texto\n";

(3): Forma usada para gravação de dados em arquivos. Veremos isto mais a seguir.

Condicionais:

Condicionais executam blocos de instruções (comandos) apenas se uma condição for satisfeita.

if-elsif-else

if (condição1)

{

bloco de instruções

}

elsif (condição2)

{

bloco de instruções

}

else

{

bloco de instruções

}

Nota:
Ao contrário de outras linguagens, Perl não suporta a forma else if, mas sim a forma reduzida elsif.

Veja como fica um script simples utilizando uma condição if e else:

Programa 2: Condicional if
1 2 3 4 5 6 7 8 9 10 11 12	#!/usr/bin/perl $a = 0; if ($a == 0) { print "A variável \$a tem o valor 0."; } else { print "A variável \$a tem o valor diferente de 0."; }

Nota:
Note que utilizamos um caractere de escape, a contra-barra, para impedir que o interpretador Perl interpole a variável e imprima corretamente a frase. Caso não o tivéssemos utilizado, a saída deste script seria: A variável 0 tem o valor 0. O resultado correto também poderia ser obtido utilizando-se aspas simples ao invés de duplas.

unless-else

unless (condição)

{

bloco de instruções

}

else

{

bloco de instruções

}

Programa 3: Condicional unless
1 2 3 4 5 6 7 8 9 10 11 12	#!/usr/bin/perl $a = 0; unless ($a == 0) { print "A variável \$a tem o valor diferente 0."; } else { print "A variável \$a tem o valor 0."; }

Loops:

Loops são instruções que são repetidas até que uma condição pré-definida seja satisfeita.

for

for (incialização da variável; condição; incremento/decremento da variável)

{

bloco de instruções

}

Programa 4: Loop for
1 2 3 4 5 6	#!/usr/bin/perl for ($a = 0; $a < 11; $a++) { print "\$a é igual à $a\n"; }

Loops for são muito utilizados para a leitura completa de um array. Veja no exemplo abaixo:

Programa 5: Lendo um array com for
1 2 3 4 5 6 7 8 9 10	#!/usr/bin/perl @tipos_de_dados = ('Scalars', 'Arrays', 'Hashes'); print "Os tipos mais comuns de dados em Perl são:\n"; for ($a = 0; $a < scalar(@tipos_de_dados); $a++) { print $tipos_de_dados[$a]."\n"; }

Dica:
Observe como fazemos para descobrir quantos elementos existem em um array: forçamos o array a ser interpretado como uma scalar: scalar(@array)

while

while (condição)

{

bloco de instruções

}

Programa 6: Loop while
1 2 3 4 5 6 7 8 9	#!/usr/bin/perl $a = 0; while ($a < 11) { print "\$a é igual à $a\n"; $a++; }

Dica:
No exemplo acima devemos explicitamente incrementar a variável $a ou então cairíamos no que chamamos de loop infinito – um loop que é executado indefinidamente, já que a condição é sempre satisfeita.

do-while

do

{

bloco de instruções

}

while (condição)

Programa 7: Loop do-while
1 2 3 4 5 6 7 8 9	#!/usr/bin/perl $a = 0; do { print "\$a é igual à $a\n"; } while ($a < 11)

Nota:
Em um loop do-while o bloco de instruções é sempre executado pelo menos uma vez, já que a condição só é testada posteriormente. Assim sendo teremos uma linha de saída mesmo que a variável $a fosse inicializada com o valor 11 ou outro valor maior.

Comentários:

Comentários em Perl podem ser feitos de duas maneiras.

Comentários de uma linha devem ser iniciados pelo caractere #:

# Este é um comentário de uma linha

Comentários de mais de uma linha devem ser colocados entre =string e =cut:

=comentários

Este é um

comentário

em mais de

uma linha

=cut

Operadores:

Auto-incremento e auto-decremento

São os operadores que permitem ao programador somar ou subtrair um ao valor de uma variável.

São eles:

++- Soma um ao valor de uma variável

-- - Subtrai um do valor de uma variável

Dependendo de sua posição em relação à variável a soma ou subtração é feita antes ou depois do retorno do valor da mesma. Veja os exemplos abaixo:

Programa 8: Incremento e decremento
1 2 3 4 5 6 7	#!/usr/bin/perl $a = 0; print ++$a."\n"; #Exibirá 1 print $a++."\n"; #Exibirá 1 print $a; #Exibirá 2

Aritméticos:

Operador	Significado
+	Adição
-	Subtração
*	Multiplicação
/	Divisão
**	Potência
%	Módulo

Programa 9: Operadores aritméticos
1 2 3 4 5 6 7 8 9 10 11	#!/usr/bin/perl $a = 2; $b = 3; print $a + $b."\n"; #Exibirá 5 print $a - $b."\n"; #Exibirá -1 print $a * $b."\n"; #Exibirá 6 print $a / $b."\n"; #Exibirá 0.666666666666667 print $a ** $b."\n";#Exibirá 8 print $a % $b."\n"; #Exibirá 2

Atribuição

Operador	Significado
=	Atribuição (estruturas)
=>	Atribuição (elementos de hashes)

Dica:
Operadores aritméticos e de atribuição podem ser usados em conjunto: $a += 2; # $a é $a + 2 $a -= 2; # $a é $a – 2; e assim por diante.

Comparação

Operador	Significado
==	Igualdade (numéricos)
!=	Diferença (numéricos)
eq	Igualdade (strings)
ne	Diferença (strings)
>	Maior que
<	Menor que
>=	Maior ou igual à
<=	Menor ou igual à

Trabalhando com arquivos em Perl

Para trabalhar com um arquivo em Perl deve-se primeiramente "abrí-lo" e declarar a operação que será feita neste arquivo: leitura ou gravação. Isto é feito com o comando open.

open filehandle, modo

onde filehandle é uma string que será a referência à este arquivo e mode é um dos modos abaixo:

Modo	Significado
<	abre o arquivo apenas para leitura.
>	abre o arquivo para gravação, zerando seu conteúdo. Caso o arquivo não exista, tenta criá-lo.
>>	abre o arquivo para adicionar conteúdo. Caso o arquivo não exista, tenta criá-lo.

Veja o programa exemplo:

Programa 10: Arquivos
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29	#!/usr/bin/perl open arquivo1, '>teste1.txt'; #abre o arquivo teste1.txt para gravação print arquivo1 "Este é um teste\n"; #escreve no arquivo close(arquivo1); #fecha o arquivo open arquivo1, '<teste1.txt'; #abre o arquivo teste1.txt para leitura while (<arquivo1>) #enquanto está lendo o arquivo { print $_."\n"; #imprima a linha } close(arquivo1); #fecha o arquivo open arquivo1, '>>teste1.txt'; #abre o arquivo teste1.txt para adicionar conteúdo print arquivo1 "Mais um teste\n"; #escreve no arquivo close(arquivo1); #fecha o arquivo # Lê o arquivo novamente open arquivo1, '<teste1.txt'; while (<arquivo1>) { print $_."\n"; } close(arquivo1);

Dicas:
Note que para ler linha a linha, utilizamos duas notações que ainda não vimos neste curso: <filehandler> representa o conteúdo do arquivo. Pode ser inclusive utilizado para armazenar todo o conteúdo em uma variável como no exemplo abaixo: $variavel = <filehandler>; Utilizamos a variável especial $_ para ler cada linha do nosso arquivo. A variável especial $_ seria o equivalente ao this do javascript ou ao $this do php.

Fontes de referências

http://perldoc.perl.org – Referência Perl em formato HTML pesquisável

http://www.perlmonks.org/ - Comunidade Perl, com fórum, o melhor fórum de Perl

http://cpan.org/ - Repositório de módulos Perl

http://perl.org.br – Sociedade Perl do Brasil

http://brasil.pm.org/ - Site oficial dos Perl Mongers Brasileiros

http://portoalegre.pm.org/ - Site oficial dos Perl Mongers Gaúchos

http://mail.pm.org/mailman/listinfo/cascavel-pm/ - Lista "Oficial" de discussão dos Perl Mongers Brasileiros

Créditos

Esta apostila foi criada por Er Galvão Abbott, com o auxílio dos Perl Mongers Brasileiros e dos Perl Monks.

Introdução à linguagem Perl

Instrutor: Er Galvão Abbott – www.galvao.eti.br

Este material foi preparado pelo instrutor com o auxílio inestimável dos Perl Mongers Brasileiros

Introdução à linguagem Perl

Programação

Perl Programação

Er Abbott

2005-05-05T00:55:47

Er Abbott