Po prostu kolejny haker Perla

Po prostu inny haker Perla lub JAPH zazwyczaj odnosi się do programu Perla , który wypisuje „Kolejny haker Perla” (przecinek jest kanoniczny, ale czasami jest pomijany). Krótkie programy JAPH są często używane jako podpisy na forach internetowych lub jako projekty koszulek . Wyrażenie lub akronim jest również czasami używane (bez kodu ) do podpisu.

Programy JAPH są klasycznie wykonywane przy użyciu niezwykle zaciemnionych metod, w duchu konkursu Obfuscated C Contest . Niedawno, gdy zjawisko to stało się dobrze znane, wyrażenie to jest czasami używane w zwykłych przykładach (bez zaciemniania).

Pomysł użycia maleńkich programów w Perlu, które drukują podpis jako podpis , wyszedł od Randala L. Schwartza w jego postach na grupie dyskusyjnej comp.lang.perl. Napisał wiele JAPH, które są pokazane poniżej.

Przykłady

Program JAPH bez zaciemniania:

  print  "Kolejny haker Perla,"  ; 

Osadzanie JAPH w nieprzejrzystym kodzie:

 $_  =  '987;s/^(\d+)/$1-1/e;$1?eval:print"Kolejny haker Perla,"'  ;  ewaluacja  ; 

Dekodowanie JAPH z transponowanego literału łańcuchowego :

  $_  =  "krJhruaesrltre ca cnP,ohet"  ;  $_  .=  $1  ,  wypisz  $2while  s/(..)(.)//  ; 

Drukowanie JAPH jako oddzielnych procesów:

  0 
      
          0            
                       for  $i  (  ..  4  )  {  if  (  !  fork  )  {  $i  ==  lub  nie  {  $SIG  {  LCAŁK  }  =  sub  {  print  "J"  }  }  lub  $i  ==  1  lub  nie  {  $SIG  {  LCAŁK  }  =  sub  {  drukuj  "A"  }  }  lub 
                      
                      
         
        
    


    $i  ==  2  lub  nie  {  $SIG  {  LCAŁK  }  =  sub  {  print  "P"  }  }  lub  $i  ==  3  lub  nie  {  $SIG  {  LCAŁK  }  =  sub  {  print  "H"  }  }  ;  spać  $i  ;  ostatni  ;  }  }  zabij  LCAŁK  =>  $$  ; 

Wygląda na to, że robi coś zupełnie niezwiązanego z drukowaniem JAPH:

  
     $_  =  "wftedskaebjgdpjgidbsmnjgc"  ;  tr  /az/o  h  ,  słoik  fraz  z golfem  !/  ;  drukować  ; 

Rozwidlanie procesów w celu wydrukowania jednej litery w odpowiedniej kolejności:

 
 @P  =  split  //  ,  ".URRUU\c8R"  ;  @d  =  split  //  ,  "\nrekcah xinU / lreP rehtona tsuJ"  ;  sub  p  {  @p  {  "r$p"  ,  "u$p"  }  =  (  P  ,  P  );  potok  "r$p"  ,  "u$p"  ;  ++  $p  ;(  $q  *=  2  )  += 
 $f  =!  widelec  ;  map  {  $P  =  $P  [  $f  ^  ord  (  $p  {  $_  })  &  6  ];  $p  {  $_  }  =  / ^ $ P/ix  ?  $P:close$_  }  klucze  %p  }  p  ;  p  ;  p  ;  p  ;  p  ;  mapa  {  $p  {  $_  }  =~ 
   /^[P.]/  &&  zamknij  $_  }  %p  ;  czekać  do  $?  ;  map  {  /^r/  &&  <$_>  }  %p  ;  $_  =  $d  [  $q  ];  sleep  Rand  (  2  )  if  /\S/  ;  wydrukować 

Używając tylko słów kluczowych Perla (bez interpunkcji ):

        
        
        
        
        
  not  exp  log  srand  xor  s  qq  qx  xor  s  x  x  długość  uc  ord  i  wypisz  chr  ord  dla  qw  q  dołącz  użyj  sub  wiązane  qx  xor  eval  xor  print  qq  q  q  xor  int  eval  lc  q  m  cos  i  wypisz  chr  ord  dla  qw        
       
         
       
       
      y  abs  ne  otwórz  związany  hex  exp  ref  y  m  xor  skalar  srand  print  qq  q  q  xor  int  eval  lc  qq  y  sqrt  cos  i  wypisz  chr  ord  dla  qw  x  printf  każdy  zwróć  lokalny  x  y  lub  wydrukuj  qq  s  s  i  eval  q  s     
       
      
        undef  lub  oct  xor  czas  xor  ref  print  chr  int  ord  lc  foreach  qw  y  hex  alarm  chdir  kill  exec  return  y  s  gt  sin  sort  split 

Używaj tylko znaków interpunkcyjnych , bez znaków alfanumerycznych . To psuje się po Perlu 5.30.0, ponieważ użycie $# i $* powoduje błędy krytyczne. Ten JAPH został napisany przez Erica Roode'a i działa tylko na systemach Unix i systemach uniksopodobnych :


 `$=`  ;  $_  =\  %  !;($  _  )  =  /(.)/  ;  $=  =++  $|  ;(  $.  ,  $/  ,  $,  ,  $\  ,  $"  ,  $;  ,  $^  ,  $#  ,  $  ~ ,  $*  ,  $:  ,  @%  )  =  (  $!  =~  /(.)(. ).(.)(.)(.)(.)..(.)(.)(.)..(.)......(.)/ , $  "  )  , 

 $=  ++  ;  $.  ++  ;  $.  ++  ;  $_  ++  ;  $_  ++  ;(  $_  ,  $\  ,  $,  )  =  (  $~  .  $"  .  "$;$/$%[$?]$_$\$,$:$%[$?]"  ,  $"  &  $~  ,  $#  ,);  $,  ++  ;  $,  ++  ;  $^  |=  $"  ;  `$_$\$,$/$:$;$~$*$%[$?]$.$~$*${#}$%[$?]$;$\$"$^$~$ *.>&$=` 

Znacznie krótsza, wykorzystująca tylko znaki interpunkcyjne, oparta na module EyeDrops :


 ''  =~  (  '(?{'  .  (  '-)@.)@_*([]@!@/)(@)@-@),@(@@+@)' ^ ']  [  ) @]`}`]()`@.@]@%[`}%[@`@!#@%['  )  .  ',"})'  ) 

Grafika ASCII (aby ten kod w kształcie dromadera działał, rozmiar konsoli musi być ustawiony na co najmniej 119×48):

                                                       
                                                    
                                           
                                     
                              0 #  sub  j  (\$){(  $  P  ,  $ V  )  =  @_  ;  while  (  $$P  =~  s:  ^  ([()])  ::  x  ){  $V  +=  (  '('  eq  $1  )?  -  32  :  31  }  $V  +=  ord  (  substr  (  $$P  ,  ,  1  ,  ""  ))  -   
                           
          74  }  sub  za  {  mój  (  $I  ,  $K  ,  $  J  ,  $L  )  =  @_  ;  $I  =  int  (  $I  *  $M  /  $Z  );  $K  =  int  (  $K  *  $M  /$Z);$J=int($J*$M /  $Z  );  $L  =  int  (  $L  *  $M  /  $Z  );  
                   0 
                  $G  =  $  J  -  $I  ;  $F  =  $L  -  $K  ;  $E  =  (  abs  (  $  G  )  >=  abs  (  $ F  ))?  $G:$F  ;(  $E  <  )  i  (  $  I  ,  $ K  )  =  (  $ J  ,  $ L  );  $E  ||=  0,01  ;  dla  ( 0  
                   
                      $i  =  ;  $i  <=  abs  $E  ;  $i  ++  ){  $D  ->  {  $K  +  int  (  $i  *  $F  /$E) }->{$I+int($i*$G/  $E  )}  =  1  }}  sub  p  {  $D  =  {};  $  Z  =  $ z  ||  0,01  ;  mapa  {  $H  =  $_  ;  $ja  = 
                0  $N  =  j  $H  ;  $K  =  $O  =  j  $H  ;  while  (  $H  ){  $q  =  ord  substr  (  $H  ,  ,  1  ,  ""  );  jeśli  (  42  ==  $q  ){  $J  =  j  $H  ;  $L  =  j  $H  }  else  {  $q  -=  43  ;  
               
               $L  =  $q  %9  ;  $J  =  (  $q  -  $L  )  /  9  ;  $L  =  $q  -  9  *  $J  -  4  ;  $J  -=  4  }  $J  +=  $I  ;  $L  +=  $K  ;  a  (  $I  ,  $K  ,  $J  ,  $  L  );  (  $I  ,  $K  
               )  =  (  $J  ,  $L  )}  za  (  $I  ,  $K  ,  $N  ,  $O  )}  @_  ;  moje  $T  ;  mapa  {  $y  =  $_  ;  map  {  $T  .=  $D  ->  {  $y  }  ->  {  $_  }?  $\  :  ' '  } (  -  59  ..  59  );  
               
               $T  .=  "\n"  }(  -  23  ..  23  );  print  "\e[H$T"  }  $w  =  eval  {  wymaga  Win32::Console::ANSI  };  $b  =  $w  ?  „1;7;”  :  ""  ;(  $j  ,  $u  ,  $s  ,  $t  ,  $a  ,  $n  ,  $o  ,  $h  ,  $c  , 
               
               
                 $k  ,  $p  ,  $e  ,  $r  ,  $l  ,  $C  )  =  split  /}/  ,  'Tw*JSK8IAg*PJ[*J@wR}*JR]*QJ[*J'  .  'BA*JQK8I*JC}KUz]BAIJT]*QJ[R?-R[e]\RI'  .  '}Tn*JQ]wRAI*JDnR8QAU}wT8KT'  .  ']n*JEI*EJR*QJ]*JR*DJ@IQ[}*JSe*JD[n]*JPe*'  .  'JBI/KI}T8@?PcdnfgVCBRcP'  .  '?ABKV]]}*JWe*JD[n]*JPe*JC?8B*JE};Vq*OJQ/IP['  .  'wQ}*JWeOe{n*EERk8;'  . 
                  
                     
                        
                          
                                    
                               'J*JC}/U*OJd[OI@*BJ*JXn*J>w]U}CWq*OJc8KJ?O[e]U/T*QJP?}*JSe*JCnTe'  .  'QIAKJR}*JV]wRAI*J?}T]*RJcJI[\]3;U]Uq*PM[wV]W]WCT*DM*SJ'  .  'ZP[Z'  .  'PZa[\]UKVgogK9K*QJ[\]n[RI@*EH@IddR[Q[]T]T]T3o[dk*JE'  .  '[Z\U'  .  '{T]*JPKTKK]*OJ[QIO[PIQIO[[gUKU\k*JE+J+J5R5AI*EJ00'  .  'BCB*'  .  'DMKKJIR[Q+*EJ0*EK'  ;  sub  h  {  $\  =  qw(% & @ x)  [  int  rand  4       
                               0          
                                0     ];  map  {  printf  "\e[$b;%dm"  ,  int  (  rand  6  )  +  101  -  60  *  (  $w  ||  );  system  (  "cls"  )  jeśli  $w  ;(  $A  ,  $S  )  =  (  $_  [  1  ],  $  _  [  ]);(  $ M  ,  @  ,)  =  podział        
                                0              
                                               
                                 '}'  ;  for  (  $z  =  256  ;  $z  >  ;  $z  -=  $S  ){  $S  *=  $A  ;  p  @  ,}  śpij  $_  [  2  ];  while  (  $_  [  3  ]  &&  (  $  z  +=  $  S  )  <=  256  ){  p  @  ,}}(  ""                
                                                  
                                                 
                                                     
                                  .  "32}7D$j"  .  "}AG"  .  "$u}OG"  .  "$s}WG"  .  "$t"  ,  ""  .  "24}("  .  "IJ$a"  .  "}1G$n"  .  "}CO$o"  .  "}GG$t"  .  "}QC"  .  "$h}"  .  "^G$e"  .  "})IG"  .  "$r"  ,  "32}?"                  
                                                        
                                                         
                                                          
                                                        
                                             .  "H$p}FG$e}QG$r"  .  "}ZC"  .  "$l"  ,  "28}(LC"  .  ""  .  ""  .  "$h}:"  .  "J$a}EG"  .  "$c"  .  "}M"  .  "C$k}ZG"  .  "$e"  .  "}"  .  "dG$r"  ,  "18"  .  "}("  .  "D;"  .            0
                                         00            
                                        0              
                              "$C"  )}{  h  (  16  ,  1  ,  1  ,  );  h  (  8  ,  0,98  ,  ,  );  h  (  16  ,  1  ,  1  ,  1  )  ;  h  (  8,0  ,  0,98  ,  1  )  ;  powtórz  }  ###  #pisane 060204 przez 
                           
                         #liverpole @@@@@@@  #@@@@@@@@@@@ 

Zobacz też

Dalsza lektura

  •   Simona Cozensa (2005). Zaawansowane programowanie w Perlu . O'Reilly. s. 261 –263. ISBN 9780596004569 .

Linki zewnętrzne