[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