[Cascavel-pm] Teste para "Perl Job Developer"
Nilson Santos Figueiredo Junior
acid06 em gmail.com
Segunda Janeiro 1 19:47:24 PST 2007
On 1/1/07, Solli Honorio <shonorio em gmail.com> wrote:
> Já o "Senior Perl Developer" tem que explicar o código :
> s;(?:SEEKING)?;PERLqny~%|fsyx%~tz&;?$^X=~m.\w+$.
> :DEVELOPERS;s"$&"Ktsf"i;s^.^chr ord($&)-5^eg;$\=$/;print||" ;) "
> ... e este eu compreendi nada.
Nem souberam fazer o golf ser cross platform. Fonality--.
Enfim, basta rodar um "perl -MO=Deparse" no código e o próprio Perl
desobfusca pra você, ele só perde as constantes. Um código equivalente
ao acima é o seguinte:
s/(?:SEEKING)?/PERLqny~%|fsyx%~tz&/ ? $^X =~ /\w+$/ : 'DEVELOPERS';
s/$&/Ktsf/i;
s/./chr ord($&) - 5;/eg;
$\ = $/;
' ;) ' unless print $_;
O golf não é cross platform porque ele assume que a variável $^X vai
terminar em "perl", o que nem sempre vai ser verdade (às vezes, nem
mesmo em um Unix isso será verdade).
Mas vamos lá, linha a linha.
s/(?:SEEKING)?/PERLqny~%|fsyx%~tz&/ ? $^X =~ /\w+$/ : 'DEVELOPERS';
Essa linha pode ser quebrada em duas partes:
s/(?:SEEKING)?/PERLqny~%|fsyx%~tz&/
Só serve pra colocar a string "PERLqny~%|fsyx%~tz&" na variável $_
(ela substitui a string vazia por isso).
$^X =~ /\w+$/
Essa parte serviria pra popular a variável especial $& com a palavra
"perl", porém, sob Windows, ela popula a variável com a palavra "exe".
Isso acontece porque a expressão regular tenta pegar a última
seqüência de caracteres alfanuméricos dentro da variável $^X, que
contém o caminho do binário do perl. No Windows, o conteúdo de $^X
será algo como "C:\perl\bin\perl.exe" (última seqüência = "exe") no
Linux isso será algo como "/usr/bin/perl" (última seqüência = "perl").
A variável $& será populada com isso porque ela guarda o valor do
último match de uma expressão regular. Na prática, seu uso é
desaconselhado pois ela infere problemas de performance em todo o
aplicativo do seu uso pra frente.
Em seguida, vem a linha:
s/$&/Ktsf/i;
Que seriviria pra substituir o "PERL" na string anterior em "Ktsf"
(funciona pois tem /i ou seja, case-insensitive).
Por fim, vem a substituição propriamente dita:
s/./chr ord($&) - 5;/eg;
Que simplesmente substitui cada um dos caracteres pelo caracter de
código 5 unidades menor na tabela ASCII. Por exemplo, o caracter 'f'
(102) será substituído pelo caracter 'a' (97). O lado direito da
expressão regular é executado por causa da flag /e.
Por fim, a linha
$\ = $/;
É apenas o toque final, pra imprimir o \n no final da mensagem. A
variável $\ guarda o "output record separator" que é um conjunto de
caracteres que sera usado como sufixo de todos os print()s. A variável
$/ é o "input record separator" que contém o caracter \n por padrão.
Depois, vem um print() que faz com que a mensagem seja impressa na tela.
Na seção de Obfuscation do PerlMonks tem alguns bem mais complexos e
difíceis de enteder que esses.
-Nilson Santos F. Jr.
Mais detalhes sobre a lista de discussão Cascavel-pm