[Cascavel-pm] Teste para "Perl Job Developer"
Eden Cardim
edencardim em gmail.com
Terça Janeiro 2 05:59:24 PST 2007
On 1/2/07, Solli Honorio <shonorio em gmail.com> wrote:
> Eden, hoje estou empenhado em terminar o dia com um novo conhecimento do
> Perl... e este negócio e uma daquelas coisas que eu ví um monte de vezes e
> fiz cara de conteúdo.
> Segundo eles, o "Junior Perl Developer" tem que compreender o segundo código
> "s|(\d)|length(9 x $1)|eg;". Bom, este é fácil, só não sei para que serve, já que na
> minha leitura não funciona.
Isso funciona mas é um no-op inútil. Cada dígito é capturado, e
substituido pelo tamanho em caracteres da multiplicacao da string "9"
pelo dígito capturado. Esse tamanho vai sempre ser o mesmo número (a
não ser que eu esteja esquecendo de algum detalhe pernicioso sobre
tamanho de strings).
> Lí o perlre neste ponto e fiquei mais confuso ainda... primeiro sobre o
> código "(?:SEEKING)?". De cara eu pensei que o "SEEKING" fosse uma palavra
> reservada, mas pelo jeito não é. Esta palavra está aí para nada ? Ou está
> apenas tentando dar um match nesta palavra, que não existe ?
Sim, ele está tentando dar um match opcional na palavra SEEKING.
A palavra precisa ser agrupada, pro quantificador ? operar sobre a
palavra inteira.
Se a regex fosse /SEEKING?/, apenas o 'G' seria opcional.
Porém, os agrupadores também capturam o que foi dado match dentro do
grupo, reduzindo a performance. Observe que é meio inútil capturar um
trecho literal em uma regex:
<code>
$string =~ /(SEEKING)?/;
print $1;
</code>
Logo, a prática correta nesse caso, é usar os agrupadores sem captura,
para não prejudicar o desempenho do sistema.
> Agora sobre o "?:", que segundo o perlre é para agrupamento e não para
> captura. Hummm alguém pode me dar um exemplo para dummy sobre isto ? Eu
> tentei escrever alguns código bobo para tentar entender isto, mas sem
> sucesso.
O uso de (?:) é exatamente igual ao uso de ():
<code>
s/use\s+(Java|Python|PHP)/Perl/g;
</code>
Pode ser escrito assim:
<code>
s/use\s+(?:Java|Python|PHP)/Perl/g;
</code>
Isso se vc não fizer questão de saber quem foi substituido.
--
Eden Cardim
Instituto Baiano de Biotecnologia
Núcleo de Biologia Computacional e Gestão de Informações Biotecnológicas
Laboratório de Bioinformática
--
"you seem to think that 'close enough' is close enough...
please learn to be 'literal' around programming."
merlyn - on irc.freenode.net#perl
Mais detalhes sobre a lista de discussão Cascavel-pm