[SP-pm] FAQ - O Desafio!

Eden Cardim edencardim at gmail.com
Thu Oct 6 15:15:26 PDT 2011


>>>>> "Thiago" == Thiago Rondon <thiago em aware.com.br> writes:

    Thiago> Pessoal,

    Thiago> Eu repassei o conteúdo do FAQ para o git, e agora com scripts (eu copiei do 
    Thiago> repositório do modern_perl) para converter em HTML, PDF, e etc.

    Thiago> O endereço é : https://github.com/maluco/faq_perl_pt_br

    Thiago> Eu quero propor um desafio, para que no próximo mês , os que toparem
    Thiago> participarem, terem que enviar APENAS DUAS perguntas com sua resposta 
    Thiago> respectivamente a cada 7 dias (1 semana) durante 1 mês.

    Thiago> O FAQ esta divido inicialmente nas seguintes seções (e provavelmente
    Thiago> com mais perguntas, pode ser mais dívido mais ainda):

    Thiago> 1 - Questões gerais sobre o que é a linguagem
    Thiago> 2 - Obtendo, Socializando e Aprendendo Perl
    Thiago> 3 - Soluções disponíveis em Perl
    Thiago> 4 - A linguagem
    Thiago> 5 - Manipulação de dados
    Thiago> 6 - Expressões regulares

    Thiago> O desafio é:

    Thiago> 1 - Reunir os participantes do desafio até 9/10 e enviar para lista
    Thiago> os participantes. ENVIE UM E-MAIL PARA LISTA, RESPONDENDO ESTE E-MAIL
    Thiago> DIZENDO QUE VAI PARTICPAR. :-)

ok, to dentro.

    Thiago> 2 - As rodadas (semanas), serão:
    Thiago>     - 10/10 até 16/10
    Thiago>     - 17/10 até 23/10
    Thiago>     - 24/10 até 30/10
    Thiago>     - 31/10 até 06/11

Bom, vou aproveitar que estou motivado e enviar as minhas perguntas da
primeira rodada agora. Estou na dúvida se é pra mandar commit direto ou
enviar aqui, como é mais fácil enviar aqui, seguem as
perguntas/respostas:

----

Tem uma forma rápida de verificar/manipular um valor dentro de um hash
ou array sem usar uma variável temporária?

A forma tradicional de validar um valor dentro de um hash é usando uma
variável temporária para evitar o trabalho de referenciar o valor toda
hora:

  my $hash = { int => 20, str => 'blah' };

  my $int = $hash->{int};
  return defined $int
     and length $int
     and $int =~ /^\d$/;

Isso tudo pode ser encurtado para:

  return defined and length
    for $hash->{int};

Você também fazer modificações dentro do hash, já que o for cria um
alias. Por exemplo, para remover os espaços do começo da string,
substituir ' ' por '_', remover o último "\n" e depois imprimir, mas só
se a string resultante tiver mais de 10 caracteres:

s/^\s*//, tr/ /_/, chomp, length > 10 and print for $hash->{str};

Uma das vantagens de se usar for invés de uma atribuição diretamente
para a variável $_ é que o for declara $_ como local automaticamente
antes de criar o alias, assim você não corre o risco de pisotear algum
valor pré-existente.

----

Como eu crio um select/case/switch eficiente em perl?

Aa linguagem tem suporte nativo a esse tipo de construção desde a versão
5.10:

given($status) {
  when(/^404$/) { print "página não encontrada\n" }
  when(/^500$/) { print "erro no servidor\n" }
  when(/^302$/) { print "você foi redirecionado\n" }
  default       { print ""resposta desconhecida" }
}

O problema com esse tipo de abordagem é que para valores '302', o teste
vai sempre passar pelo teste de '404' e '500', e falhar antes de testar
positivamente, quanto mais valores possíveis, mais testes redundantes
são executados. O pior caso é quando você cai no valor default onde
todos os testes são executados.

Esse problema pode ser resolvido com uma construção um pouco menos
legível mas muito mais eficiente, usando uma tabela de dispatch, da
seguinte forma:

({
         404 => sub { print "página não encontrada\n" },
         500 => sub { print "erro no servidor\n" },
         302 => sub { print "você foi redirecionado\n" }
}->{$status} or sub { print "resposta desconhecida" })->()

Isso fará com que apenas uma operação de lookup seja executada, qualquer
que seja o valor de $status, sendo assim, bem mais eficiente do que usar
a construção given/when. Obviamente isso só funciona quando se deseja
comparações exatas de valores, caso você precise casar com uma regex
para fazer o dispatch, a solução é usar given/when.

-- 
  Eden Cardim
  Code Monkey                    http://www.shadowcat.co.uk/catalyst/
 Shadowcat Systems Ltd.  Want a managed development or deployment platform?
http://blog.edencardim.com/            http://www.shadowcat.co.uk/servers/
http://twitter.com/#!/edenc


More information about the SaoPaulo-pm mailing list