[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