[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