O primeiro script em Perl

by

No post sobre instalação do modperl, foi utilizado o seguinte script de teste:

use strict;
use warnings;
 
my $r = shift;
 
$r->content_type("text/html");
 
print "Funcionou!";

Pra quem está chegando no Perl agora, já dá pra perceber algumas bizarrices curiosidades.

use strict; use warnings;

Estas duas linhas são consideradas boa prática em qualquer script que servirá pra algo mais que um teste rápido.

strict e warnings são pragmas do Perl; são módulos que alteram o compartamento interno do interpretador.

O pragma strict restringe o uso de algumas declarações que poderiam levar o programador a enganos, como a utilização de variáveis sem escopo declarado. Havendo algum problema, o interpretador não prossegue e o script não é iniciado.

Já o pragma warnings avisa sobre comportamentos não tratados, como ao somar uma string não numérica com um inteiro. No modperl, estes avisos serão mostrados no log de erro do Apache.

Para um código minimamente claro e de depuração um pouco mais fácil, o uso destas duas declarações em cada script é fundamental.

Escopo

Para seguir o uso strict, cada variável precisa ter seu escopo definido.

No teste, a variável $r foi precedida de my para declarar o seu escopo – neste caso é o escopo do arquivo.

Quando a declaração é feita dentro de algum bloco (closure), o tempo de vida da variável fica limitado ao bloco ao qual pertence.

my $idade = 22;
if ( $idade > 18 ) {
    my $mensagem = "Você que tem $idade anos!";
    print $mensagem;
}
# aqui fora, a variável $mensagem não existe mais!

Scalar, Array e Hash

No Perl você vai se deparar com estes três tipos de variável:

my $scalar = “Inteiro ou string”;

my @lista = (‘lista’, ‘de’, ‘qualquer’, ‘coisa’);

my %dicionario = (
    ‘pais’ => ‘Brasil’,
    ‘estado’ => ‘Rio de Janeiro’,
    ‘cidade’ => ‘Rio de Janeiro’,
);

No PHP, o array ser de índice numérico, como uma lista mesmo, ou associativo, funcionando como um dicionário.

No Perl (e na maioria das linguagens), o array é apenas para fins de lista, enquanto o dicionário é representado por um hash.

O importante é lembrar que a declaração é feita com $ para scalar, @ para lista e % para hash.

Ao acessar um array ou hash, o $ é utilizado:

print $lista[2];
# mostra a palavra qualquer
 
print $dicionario{'pais'};
# mostra Brasil

A variável $_

Em muitos casos, algumas funções dispensam argumentos e trabalham diretamente com variáveis pré-definidas. Por exemplo:

open(ARQUIVO, "/etc/crontab");
while (<ARQUIVO>) {
    print;
}
close(<ARQUIVO>);

O loop na verdade utiliza a variável $_ implicitamente. O trecho acima seria o mesmo que:

while ($_ = <ARQUIVO>) {
    print $_;
}

De uma forma geral, é conveniente evitar o seu uso a favor de um código mais claro:

while (my $linha = <ARQUIVO>) {
    print $linha;
}

Observe o uso do my para declarar a variável no escopo do while. Fora dele ela deixará de existir.

Funções

As funções são declaradas com sub (de subrotina) e não têm assinatura dos parâmetros. Ao invés disso, os argumentos chegam no array @_.

Quando a função espera somente um argumento, eu costumo ver o uso da função shift para recuperá-lo:

sub diga_oi {
    my $nome = shift;
    print "Oi $nome";
}
 
diga_oi("Nash");

Assim como algumas funções utilizam $_ no contexto de scalar, a função shift utiliza o @_ no contexto de array quando está dentro de funções, retirando e retornando o primeiro elemento.

Se a função espera mais de um argumento, ao invés de utilizar o shift várias vezes é comum associar cada item da lista a uma variável:

sub nova_mensagem {
    my ($usuario, $mensagem) = @_;
    print "$usuario disse: $mensagem";
}
 
nova_mensagem("Bart", "Eu não fiz isso!");

Se você passar argumentos a mais, eles serão ignorados. Se faltar algum, as respectivas variáveis ficarão como undef sem que nenhum erro ocorra.

O request no modperl

Quando o modperl foi configurado, utilizamos PerlHandler ModPerl::Registry.

Este handler pega o script Perl acessado pelo Apache e o executa como se fosse uma função.

Considerando que agora o script é uma função, fazer my $r = shift; nada mais é do que pegar o primeiro argumento passado pelo array @_, que neste caso é um objeto Apache2::RequestRec.

Este objeto representa a ligação direta entre o modperl e o Apache, permitindo acessar e alterar diversos elementos da requisição e resposta.

No teste feito foi necessário definir o tipo do conteúdo da resposta para Html pelo método content_type (coisa que o PHP faz automaticamente, até por causa da proposta de cada linguagem).

Sabe tudo de Perl agora!

Acho que agora deu pra desmistificar um pouco o primeiro script web.

Ou não?

Anúncios

3 Respostas to “O primeiro script em Perl”

  1. Lorn Says:

    Achei muito legal a iniciativa de vocês quanto a Perl, deem uma olhada nesse tutorial:

    http://www.maluco.com.br/perl/

    E olhem os links que eu deixei no outro comentário, talvez vocês já conhecam mas fica a dica 🙂

  2. dark jedi Says:

    muito boa a dica serve bastante para iniciantes em perl assim como eu :), e parabéns pelo blog está show…

    abs

  3. Tylër Says:

    O mais importante não aprendi, recuperar parâmetros vindos do PHP –‘

    $foo = ‘bar’;
    exec(“../files_pl/examples.pl $foo”);

    mas e no perl como fica?

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s


%d blogueiros gostam disto: