PERL
Practical Extraction and Report Language
Um Pouco Sobre Perl
• Perl é uma linguagem poderosa e adaptável
a diversas situações.
• Sua primeira versão foi desenvolvida por
Larry Wall, um linguista que trabalhava
para a NASA na década de 80 como
administrador de sistemas. Era utilizada
para facilitar o processamento de relatórios.
Um Pouco Sobre Perl
• É uma linguagem criada para processar e
manipular textos.
• Nos dias atuais é utilizada na administração de
sistemas, como interface para permitir a
comunicação entre sistemas diferentes, na
programação para a web, em bioinformática,
ou mesmo em desenvolvimento de aplicativos.
Um Pouco Sobre Perl
• Na programação para web, Perl é muito utilizada e
popular por suas características de manipulação de
texto e rápido desenvolvimento, tanto que chega a
ser conhecida como a “super fita crepe” da
internet.
• A interface de integração de banco de dados de
Perl suporta diversos bancos de dados como
Oracle, Sybase, Postgres e MySQL.
Um Pouco Sobre Perl
• Perl é capaz de fazer o interfaceamento através de
bibliotecas C/C++ externas através de XS ou
SWIG.
• Perl pode trabalhar com HTML, XML e outras
linguagens de marcação.
• Perl permite programação procedural ou orientada
a objetos.
• Possui várias bibliotecas disponíveis através do
CPAN.
Um Pouco Sobre Perl
• O slogan de Perl é: "Há mais de uma
maneira de se fazer as coisas.“
("There's more than one way to do it,")
• Princípio de Perl: “Coisas comuns devem
ser simples e fáceis.“
(common things should be easy and simple.)
Algumas Aplicações de Perl
• TWiki - Sistema Wiki de escrita de conteúdo
colaborativo.
• RT - Sistema de processamento de Tickets.
• Apache Spam Assassin - Sistema extensível de
filtro de Spam em email .
• Dev::rip - Programa para cópias de DVD.
• AWStats - "Advanced Web Statistics" (AWStats) é
um poderoso sistema de análise de logs de
servidores Web e de geração de estatísticas.
Algumas Empresas que Usam Perl
Algumas Empresas que Usam Perl
Algumas Empresas que Usam Perl
Sintaxe e Código
• Strings: são apresentadas entre aspas,
duplas ou simples. Exemplo: Programa
Hello, World!:
say “Hello, World!”;#exibe na tela a string Hello, World e
#insere uma nova linha.
Isto é equivalente a:
say ‘Hello, World!’; #exibe na tela a string Hello, World e
#insere uma nova linha.
Sintaxe e Código
• String entre aspas simples é considerada
literalmente.
• String entre aspas duplas é interpretada.
• Exemplo:
Print ‘Hello, \nWorld!’; #exibe Hello, World!\n na tela.
Print “Hello, \nWorld!“; #exibe Hello,
#World! na tela.
• Perl também usa \n, \t e \\ como C.
Sintaxe e Código
Operadores Básicos
• Operadores de atribuição: ++, --, +=, -=, /= e *=.
São os mesmos de C.
• Operadores de comparação: ==, != , <, >, <= e >=.
São iguais aos de C.
• Operadores matemáticos: +-*/. São iguais aos de C.
• Operador my: declaração de variável.
• Exemplo:
my $hour;
Também poderia fazer:
my $i = 15;
Sintaxe e Código
Operadores Básicos
• Perl não tem muita flexibilidade com relação
a operadores de string. O único operador
básico de string é o de concatenação: .
Exemplo:
my $a = "8"; # Observe as aspas. $a é uma string.
my $b = $a + "1"; # "1" é uma string também.
my $c = $a . "1"; # Mas $b e $c têm valores
#diferentes!
Sintaxe e Código
Operadores Básicos
• O sinal + é usado para somar números, enquanto
que o . é usado para concatenar strings.
• No exemplo anterior o valor de $b é 9, enquanto o
valor de $c é 81.
• Perl faz a conversão de maneira transparente.
• Se forem somadas coisas que não são números,
Perl fará o possível para convertê-las em números.
Sintaxe e Código
• Perl tem 3 tipos de variáveis: escalares, vetores e
hashes.
• Escalares: podem ser números, letras ou strings. O
nome de cada variável escalar começa com $.
Exemplo:
$nome = “Henrique”;
$idade = 23;
$letra = “s”;
• Não é necessário especificar para um escalar que
está atribuída uma letra ou número, pois a
conversão é automática.
Sintaxe e Código
• Guardando string em escalar: usando aspas duplas,
pode-se colocar uma variável no meio da string
que ela será interpretada. Exemplo:
use feature ':5.10';
my $apple_count = 5;
my $count_report = "There are $apple_count apples.";
say "The report is: $count_report";
Na tela será exibido:
The report is: There are 5 apples.
Sintaxe e Código
• Arrays: são conjuntos de escalares.
• Seus nomes começam com @. A lista é definida com
parênteses. Exemplo:
my @lotto_numbers = (1, 2, 3, 4, 5, 6);
my @months = ("July", "August", "September");
• O funcionamento de arrays em Perl é semelhante a C e
outras linguagens. Exemplo:
my @months = ("July", "August", "September");
say $months[0];
# Isto imprime "July".
$months[2] = "March"; # September foi renomeado para March
Sintaxe e Código
• Se um valor não existe, ele é criado na atribuição.
Exemplo:
my @winter_months = ("December", "January");
$winter_months[2] = "February";
• Para saber o número de elementos em um array,
basta atribuí-lo a um escalar: Exemplo:
my @months = ("July", "August", "September");
my $month_count = @months;
say $month_count;
# This prints 3.
my @autumn_months;
# no elements
my $autumn_count = @autumn_months;
say $autumn_count;
# this prints 0
Sintaxe e Código
• Hashes: são conjuntos de pares de dados nos quais
um dos valores é uma chave e o outro é um valor
qualquer.
• Cada chave é única em todo o conjunto.
Exemplos: dicionário, mapa, etc.
• Os nomes das variáveis hash começam com %.
Cada valor de hash é separado por vírgula.
Exemplo:
my %days_in_month = ( "July" => 31, "August" => 31,
"September" => 30 );
Sintaxe e Código
• Para obter ou modificar um valor de hash deve-se
referenciá-lo assim: $hashname{key}.
Exemplo:
say $days_in_month{September}; #imprime 30 na tela
$days_in_month{February} = 29;
Sintaxe e Código
• Para saber quais chaves estão no hash, usa-se a
função keys, que retorna uma lista (array) das
chaves no hash. Exemplo:
my @month_list = keys %days_in_summer;
# O conteúdo de @month_list é ('July', 'September',
'August').
Sintaxe e Código
• Os valores do hash não são sempre retornados na
mesma ordem.
• Os valores de um array são sempre retornados na
mesma ordem.
Sintaxe e Código
Condicionais
• Perl possui dois operadores condicionais: if e
unless.
• if: Executa o bloco seguinte se a condição for
verdadeira. Funciona igual a C.
• unless: só executa o bloco seguinte se a
condição testada for falsa, isto é retorna
verdadeiro somente se a condição testada for
falsa.
Sintaxe e Código
Condicionais
• Exemplo:
if ($year_according_to_computer == 1900) {
say "Y2K has doomed us all! Everyone to the
compound.";
}
unless ($bank_account > 0) {
say "I'm broke!";
}
Sintaxe e Código
Condicionais
• Tanto o if quanto o unless podem ser seguidos por
else. O if também pode ser seguido por elsif e
depois por else. Exemplo:
if ($a == 5) {
say "It's five!";
} elsif ($a == 6) {
say "It's six!";
} else {
say "It's something else.";
}
Sintaxe e Código
Condicionais
unless ($pie eq 'apple') {
say "Ew, I don't like $pie flavored pie.";
} else {
say "Apple! My favorite!";
}
• Perl faz uso de condições pós-fixadas, isto é
condições de uma linha, que apresentam primeiro
o que será executado e depois a condição.
Exemplo:
say "I'm leaving work early!" if $day eq 'Friday';
say "I'm burning the 7 pm oil" unless $day eq 'Friday';
Sintaxe e Código
Laços de Repetição
• for: é semelhante a outras linguagens. Podese especificar os valores da sequência, um
intervalo ou um array ou hash. Exemplo:
for my $i (1, 2, 3, 4, 5) {
say $i;
}
Sintaxe e Código
Laços de Repetição
my @one_to_ten = (1 .. 10);
my $top_limit = 25;
for my $i (@one_to_ten, 15, 20 .. $top_limit) {
say $i;
}
for my $i (keys %month_has) {
say "$i has $month_has{$i} days.";
}
for my $marx ('Groucho', 'Harpo', 'Zeppo', 'Karl') {
say "$marx is my favorite Marx brother.";
}
Sintaxe e Código
Laços de Repetição
• while: é igual a C, repete o bloco seguinte
enquanto a condição é verdadeira, parando
quando a condição for falsa. Exemplo:
my $count = 0;
while ($count != 3) {
$count++;
say "Counting up to $count...";
}
Sintaxe e Código
Laços de Repetição
• until: é semelhante a Pascal, repete o bloco
seguinte enquanto a condição é falsa,
parando quando a condição for verdadeira.
Exemplo:
my $count = 0;
until ($count == 0) {
$count--;
say "Counting down to $count...";
}
Sintaxe e Código
Sub
• Sub é o equivalente de Perl para o que em outras
linguagens é uma função. Funciona assim:
sub <nome da sub> {
<corpo da sub>
return <valor a ser retornado>
}
• O uso do return não é obrigatório. Neste caso, o
valor retornado é o resultado da última sentença
antes do fim da sub.
Sintaxe e Código
Sub
• O array @_ é usado para guardar os valores que
são passados como parâmetros para a sub.
• Através do @_ os valores passados como
parâmetros são lidos e manipulados dentro da sub.
Exemplo:
sub multiply {
my (@ops) = @_;
return $ops[0] * $ops[1];
}
for my $i (1 .. 10) {
say "$i squared is ", multiply($i, $i);
}
Sintaxe e Código
Sub
• Ao usar uma variável com o my dentro de uma
sub, a variável é considerada variável local.
• É possível atribuir valor a várias variáveis em uma
única sentença. Exemplo:
sub multiply {
my ($left, $right) = @_;
return $left * $right;
}
Expressões Regulares
• Expressões regulares ou regex são o que Perl tem
de melhor.
• São as ferramentas mais poderosas que Perl tem
no tratamento de strings.
• São tão poderosas e complexas que é possível
escrever um livro inteiro sobre elas.
• É difícil encontrar outras linguagens que usam
expressões regulares como Perl.
Expressões Regulares
• Ocorrência simples de expressão: são as
expressões regulares mais simples.
• Encontram uma ocorrência de string dentro
de outra, não importa a posição, retornando
verdadeiro.
• São usadas com expressões condicionais.
• O operador =~ é usado na verificação de
strings com esse operador.
Expressões Regulares
Exemplo:
my $user_location = "I see thirteen black cats under a ladder.";
say "Eek, bad luck!" if $user_location =~ /thirteen/;
• A string a ser buscada fica entre barras
/<string>/.
• Metacaracters: São caracteres ou sequências
de caracteres que têm um significado
especial.
Expressões Regulares
• O \n é um exemplo de metacaracter.
• Os metacaracteres mais simples são o ^e o
$.
• ^indica início de string.
• $ indica fim de string.
Expressões Regulares
• Exemplo:
for my $line (<$urllist>) {
print $line if $line =~ /^http:/ and $line =~ /html$/;
# Se a linha começa em http: e termina em html, imprime
}
• Coringas: são metacaracters que substituem
outros caracteres.
• O mais genérico deles é o ponto .
Expressões Regulares
• Dentro de uma expressão, ele encontra
qualquer outro caracter exceto o de nova
linha.
Exemplo: /Mr./ encontra qualquer expressão
que comece com Mr e tenha outros
caracteres depois.
Expressões Regulares
• Quantificadores de coringas: Indicam quantas
vezes determinado caracter ou subespressão
ocorre em uma string.
• Os quantificadores usados em Perl são:+, ?, *.
• +: encontra qualquer expressão que contenha uma
ou mais ocorrências do caracter ou metacaracter
anterior a ele.
Exemplo: /ab+c/ retorna abc, abbc, abbbc, etc.
Expressões Regulares
• *: encontra qualquer expressão que contenha
nenhuma ou mais ocorrências do caracter ou
metacaracter anterior a ele.
Exemplo: /ab*c/ retorna ac, abc, abbc, abbbc, etc.
• ?: encontra qualquer expressão que contenha
nenhuma ou uma ocorrência do caracter ou
metacaracter anterior a ele.
Exemplo: /ab?c/ retorna ac, abc.
Expressões Regulares
• Classes de Caracteres: são metacaracteres que
encontram tipos específicos de caracteres.
Exemplos:
• \d: encontra um dígito simples.
• \w: encontra um caracter de palavra simples
(palavras que tenham letra, dígito ou underscore).
• \s: encontra um caracter de espaço em branco
(incluindo, \n \t e outros)
Expressões Regulares
• \D: encontra qualquer coisa que não seja dígito.
• \W: encontra qualquer coisa que não seja palavra.
• \S: encontra qualquer coisa que não seja caracter
de espaço em branco.
Exemplos de uso:
• /^\s+/ :encontra qualquer string que comece com
caracter de espaço em branco.
Expressões Regulares
• /\w+/ : encontra qualquer string que contenha pelo
menos uma palavra.
say "Not a phone number!" unless $phone =~
/\d\d\d-\d\d\d\d/;
say "Not a phone number!" unless $phone =~ /\d{3}\d{4}/; #versão alternativa para facilitar a leitura
do código.
• \d{3} : encontra exatamente 3 dígitos.
• \d{4} : encontra exatamente 4 dígitos.
Expressões Regulares
• Definindo sua própria classe de caracters: os
caracteres que devem ser encontrados pela sua
expressão devem estar entre colchetes.
Exemplo:[aeiou] retorna apenas vogais.
/b[aeiou]g/ vai retornar bag,beg,big,bog ou bug.
• O - dá uma sequência de caracteres.
Exemplo: [a-f]:pega os caracters de a a f.
• Combinação de classes de caracteres com
quantificadores: Usados para encontrar mais de
uma ocorrência dos caracteres buscados.
Expressões Regulares
Exemplo:
say "This string contains at least two vowels in a row."
if $string =~ /[aeiou]{2}/;
• flags: alteram o comportamento padrão de
uma regex.
• Exemplo: i desliga o case-sensitive.
my $greet = "Hey everybody, it's Bob and David!";
say "Hi, Bob!" if $greet =~ /bob/i;
Expressões Regulares
• flag \x: permite o uso de espaços em branco e
comentários dentro de expressões regulares.
Exemplo:
my ($time, $hours, $minutes, $seconds) =
$string =~ /(
# capture entire match
(\d{1,2}) # one or two digits for the hour
:
Expressões Regulares
(\d{2})
# two digits for the minutes
:
(\d{2})
# two digits for the seconds
)
/x;
• Se quiser checar mais de uma coisa de uma vez, pode-se
usar o caracter | para separar coisas diferentes.
Expressões Regulares
Exemplo:
my @email_lines = ("Dear idiot:",
"I hate you, you twit. You're a dope.",
"I bet you mistreat your llama.",
"Signed, Doug");
for my $check_line (@email_lines) {
if ($check_line =~ /idiot|dope|twit|llama/) {
say "Be careful! This line might contain something
offensive:\n$check_line";
}
Expressões Regulares
A expressão /idiot|dope|twit|llama/ retorna
verdadeiro se "idiot," "dope," "twit" or
"llama" estiver presente em qualquer lugar
da string testada.
• Subespressão: permite que a string onde
houve ocorrência da subexpressão seja
armazenada na variável especial $1.
• Subexpressões são dadas entre parênteses.
Expressões Regulares
Exemplo:
for my $check_line (@email_lines) {
if ($check_line =~ /(idiot|dope|twit|llama)/) {
say "Be careful! This line contains the offensive word
'$1':\n$check_line";
}
• Se sua expressão regular contém mais de
uma expressão, elas são armazenadas em
variáveis como $1, $2, $3, etc.
Expressões Regulares
Exemplo:
my $name = 'Wall, Larry';
$name =~ /(\w+), (\w+)/;
# $1 contains last name, $2 contains first name
$name = "$2 $1";
# $name now contains "Larry Wall"
99 Bottles of Beer
Primeira versão
Versão Insana
''=~(
.('`'
.'=='
^'+')
.';-'
.('['
.'_\\{'
).(('`')|
).('['^'/')
'\\"'.('['^
'{'^"\[").(
('{'^'[').(
'`'|"\%").(
'\\"\\}'.+(
'+_,\\",'.(
'`'|"\+").(
'{'^"\[").(
'[').("\["^
')').("\["^
'.').("\`"|
'+').("\!"^
'`'|('%')).
'(?{'
|'!')
.('['
.'||'
.'-'.
^'.')
.'(\\$'
'/').').'
.('['^'/').
'#').'!!--'
'`'|"\"").(
'`'|"\/").(
'{'^"\[").(
'['^"\+").(
'{'^('[')).
'`'|"\%").(
'`'|"\$").(
'+').("\`"|
'/').("\{"^
'.').("\`"|
'+').'\\"'.
'++\\$="})'
.('`'
.('`'
^'+')
.(';'
'\\$'
.('`'
.';=('.
.'\\"'.+(
('`'|',').(
.'\\$=.\\"'
'`'|"\%").(
'`'|"\.").(
'['^"\,").(
'['^"\)").(
('\\$;!').(
'{'^"\[").(
'`'|"\/").(
'!').("\["^
'[').("\`"|
'$')."\,".(
('['^',').(
);$:=('.')^
|'%')
|',')
.('`'
&'=')
.'=;'
|'"')
'\\$=|'
'{'^'[').
'`'|('%')).
.('{'^'[').
'`'|"\%").(
'{'^"\[").(
'`'|"\!").(
'`'|"\)").(
'!'^"\+").(
'`'|"\/").(
'['^"\,").(
'(').("\["^
'!').("\["^
'!'^('+')).
'`'|"\(").(
'~';$~='@'|
.('['
.'"'.
|'/')
.(';'
.('['
.('!'
."\|".(
('`'|'"')
'\\".\\"'.(
('`'|'/').(
'['^(')')).
'['^"\/").(
'`'|"\,").(
'`'|"\.").(
'{'^"\/").(
'`'|"\.").(
'`'|('.')).
'(').("\{"^
')').("\`"|
'\\",_,\\"'
'`'|"\)").(
'(';$^=')'^
^'-')
'\\$'
.('['
&'=')
^'(')
^'+')
'`'^'.'
.('`'|'/'
'['^('(')).
'`'|"\&").(
'\\").\\"'.
'`'|"\(").(
'`'|(',')).
'['^('/')).
'`'|"\!").(
'`'|"\%").(
','.(('{')^
'[').("\`"|
'/').("\["^
.'!'.("\!"^
'`'|"\,").(
'[';$/='`';
Segunda Versão
Versão Padrão
$nBottles = $ARGV[0];
$nBottles = 100 if $nBottles eq ‘’ || $nBottles < 0;
foreach (reverse(1 .. $nBottles)) {
$s = ($_ == 1) ? “” : “s”;
$oneLessS = ($_ == 2) ? “” : “s”;
print "\n$_ bottle$s of beer on the wall,\n";
print "$_ bottle$s of beer,\n";
print "Take one down, pass it around,\n";
print $_ - 1, “ bottle$oneLessS of beer on the wall\n";
}
print "\n*burp*\n";
Referências
• http://www.perl.com/pub/a/2008/04/23/a-beginnersintroduction-to-perl-510.html
• http://www.wellho.net/mouth/969_Perl-and-.html
• http://www.perlmonks.org/?node_id=641994
• http://perl.about.com/od/perltutorials/a/foreachloop.htm
• http://perldoc.perl.org/perlvar.html
• http://news.oreilly.com/2008/06/a-beginners-introductionto-pe.html
• http://rio.pm.org/quem_usa.pl#empresas
• http://pt.wikipedia.org/wiki/Perl#M.C3.B3dulos_e_framew
orks
Download

PERL