<span style="font-family: courier new,monospace;">Nilson, obrigado pela ajuda... e já que você inicio estou com algumas dúvidas, sedo elas :</span><br><br><div><span class="gmail_quote">On 1/2/07, <b class="gmail_sendername">
Nilson Santos Figueiredo Junior</b> <<a href="mailto:acid06@gmail.com" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">acid06@gmail.com</a>> wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
On 1/1/07, Solli Honorio <<a href="mailto:shonorio@gmail.com" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">shonorio@gmail.com</a>> wrote:<br>> Já o "Senior Perl Developer" tem que explicar o código :
<br>> s;(?:SEEKING)?;PERLqny~%|fsyx%~tz&;?$^X=~m.\w+$.
<br>> :DEVELOPERS;s"$&"Ktsf"i;s^.^chr ord($&)-5^eg;$\=$/;print||" ;) "<br>> ... e este eu compreendi nada.<br><br>Nem souberam fazer o golf ser cross platform. Fonality--.<br><br>Enfim, basta rodar um "perl -MO=Deparse" no código e o próprio Perl
<br>desobfusca pra você, ele só perde as constantes. Um código equivalente<br>ao acima é o seguinte:<br><br> s/(?:SEEKING)?/PERLqny~%|fsyx%~tz&/ ? $^X =~ /\w+$/ : 'DEVELOPERS';<br> s/$&/Ktsf/i;<br> s/./chr ord($&) - 5;/eg;
<br> $\ = $/;<br> ' ;) ' unless print $_;<br><br>O golf não é cross platform porque ele assume que a variável $^X vai<br>terminar em "perl", o que nem sempre vai ser verdade (às vezes, nem<br>mesmo em um Unix isso será verdade).
<br><br>Mas vamos lá, linha a linha.<br><br> s/(?:SEEKING)?/PERLqny~%|fsyx%~tz&/ ? $^X =~ /\w+$/ : 'DEVELOPERS';</blockquote><div><br><span style="font-family: courier new,monospace;">Ah... agora ví o operador ternário '?' que executará o "$^X =~ /\w+$/" ou apenas atribuirá "DEVELOPERS" de acordo com o retorno de "s/(?:SEEKING)?/PERLqny~%|fsyx%~tz&/", que acredito eu sempre será true.
</span></div><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Essa linha pode ser quebrada em duas partes:<br><br> s/(?:SEEKING)?/PERLqny~%|fsyx%~tz&/
</blockquote><div><br><span style="font-family: courier new,monospace;"> o que significa "(?:SEEKING)?" ? Eu não consegui encontrar alguma coisa sobre este agrupamento.</span><br></div><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Só serve pra colocar a string "PERLqny~%|fsyx%~tz&" na variável $_<br>(ela substitui a string vazia por isso).<br><br> $^X =~ /\w+$/<br><br>Essa parte serviria pra popular a variável especial $& com a palavra
<br>"perl", porém, sob Windows, ela popula a variável com a palavra "exe".<br>Isso acontece porque a expressão regular tenta pegar a última<br>seqüência de caracteres alfanuméricos dentro da variável $^X, que
<br>contém o caminho do binário do perl. No Windows, o conteúdo de $^X<br>será algo como "C:\perl\bin\perl.exe" (última seqüência = "exe") no<br>Linux isso será algo como "/usr/bin/perl" (última seqüência = "perl").
<br><br>A variável $& será populada com isso porque ela guarda o valor do<br>último match de uma expressão regular. Na prática, seu uso é<br>desaconselhado pois ela infere problemas de performance em todo o<br>aplicativo do seu uso pra frente.
</blockquote><div><br><span style="font-family: courier new,monospace;">Sério ? Eu não tinha este informação de performance... então não é aconcelhável utilizar o $& nos programas ? Deve apenas fazer a atribuição "my $a = $&" !
</span><br></div><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Em seguida, vem a linha:<br><br> s/$&/Ktsf/i;<br><br>Que seriviria pra substituir o "PERL" na string anterior em "Ktsf"
<br>(funciona pois tem /i ou seja, case-insensitive).<br><br>Por fim, vem a substituição propriamente dita:<br><br> s/./chr ord($&) - 5;/eg;<br><br>Que simplesmente substitui cada um dos caracteres pelo caracter de<br>
código 5 unidades menor na tabela ASCII. Por exemplo, o caracter 'f'<br>(102) será substituído pelo caracter 'a' (97). O lado direito da<br>expressão regular é executado por causa da flag /e.<br><br>Por fim, a linha
<br><br> $\ = $/;<br><br>É apenas o toque final, pra imprimir o \n no final da mensagem. A<br>variável $\ guarda o "output record separator" que é um conjunto de<br>caracteres que sera usado como sufixo de todos os print()s. A variável
<br>$/ é o "input record separator" que contém o caracter \n por padrão.<br><br>Depois, vem um print() que faz com que a mensagem seja impressa na tela.</blockquote><div><br><span style="font-family: courier new,monospace;">
E a mensagem será "Fonality wants you!".... que meigo hein ?</span> <br></div><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Na seção de Obfuscation do PerlMonks tem alguns bem mais complexos e
<br>difíceis de enteder que esses.</blockquote><div><br><span style="font-family: courier new,monospace;">Temos que começar de algum lugar, e uma das minhas promessas para este ano é estudar estes Obfuscation, e quem sabe no final do ano publicar o meu primeiro código obfuscation :).
</span><br></div><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">-Nilson Santos F. Jr.<br>_______________________________________________
<br>Cascavel-pm mailing list
<br><a href="mailto:Cascavel-pm@pm.org" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">Cascavel-pm@pm.org</a><br><a href="http://mail.pm.org/mailman/listinfo/cascavel-pm" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">
http://mail.pm.org/mailman/listinfo/cascavel-pm</a><br></blockquote></div><br>