sub J; sub A; sub P; sub H; {s __\__ == J } sub J { print. y:s:S:.goto$ _;_:y:_:J:. J;J:y:J:u:. J;u:y:u:s:. J;S:y:S:t:. J;t:y:t: : == A } sub A { print. y: :_:.goto$ _;_:y:_:a:. A;a:y:a:n:. A;n:y:n:o:. A;o:y:o:t:. A;t:y:t:h:. A;h:y:h:e:. A;e:y:e:r:. A;r:y:r: : == P } sub P { print. y: :_:.goto$ _;_:y:_:P:. P;P:y:P:e:. P;e:y:e:r:. P;r:y:r:l:. P;l:y:l: : == H } sub H { print. y: :_:.goto$ _;_:y:_:h:. H;h:y:h:a:. H;a:y:a:c:. H;c:y:c:k:. H;k:y:k:e:. H;e:y:e:r:. H;r:y:r:_:. print;exit}
   MeowChow                                   
               s aamecha.s a..a\u$&owag.print

Replies are listed 'Best First'.
Re: goto still considered harmful
by tachyon (Chancellor) on Jun 30, 2001 at 17:07 UTC

    Ah, there's nothing like a bit of recursion to add some obfuscation. A really, really clever obfu. First you need to understand what/how this code prints:

    $_ = "_"; print; tr/_/J/; print .''; tr/J/u/; print .''.tr/u/s/; print .tr/s/t/; print .tr/t/ /;
    You can see this prints _Just by virtue of the fact that print uses $_ if no value is specified. As there is no value to the left of the concatenation that is what is used. Here is the decon:
    # declare some protos so we can call the subs J A P and H # without an & prefix or () suffix -> ie as barewords. sub J;sub A;sub P;sub H; # {s __\__ == J } is the same as: s//_/; J; # the s//_/ substitutes '_' into $_ # and the == J checks for equality to # the return value of the subroutine J # called as a bareword by virute of the # prototyping. The equiality is false BTW :-) # effectively we just call sub J sub J { print # print . # concatenate y:s:S: # tr/s/S/ important because label 's' does not exist . # concatenate goto$_; # go to '_:' label which follows _: # label y:_:J: # tr/_/J/ change value in $_ to 'J' . # concatenate J; # recursively call sub J but now $_ = 'J' # so goto $_ goes to J: below J: # more of the same..... y:J:u: # change label marker in $_ to 'u' . J; # recurse u: # label y:u:s: # change label 'u' to 's' which does not exist # but first tr before goto changes $_ 's' to 'S' # which does exist below so more of the same! . J; # recurse S: # label y:S:t: # change label marker in $_ to 't' . J; # recurse t: # label y:t: : # change label marker in $_ to ' ' == A # call the next sub A via a bareword } sub A { print. y: :_:.goto$ # change $_ from ' ' as left in the last sub # to '_' allowing us to find the label '_:' _;_:y:_:a:. # same theme repeated A;a:y:a:n:. A;n:y:n:o:. A;o:y:o:t:. A;t:y:t:h:. A;h:y:h:e:. A;e:y:e:r:. A;r:y:r: : == P } sub P { print. y: :_:.goto$ # as above _;_:y:_:P:. P;P:y:P:e:. P;e:y:e:r:. P;r:y:r:l:. P;l:y:l: : == H } sub H { print. y: :_:.goto$ # as above _;_:y:_:h:. H;h:y:h:a:. H;a:y:a:c:. H;c:y:c:k:. H;k:y:k:e:. H;e:y:e:r:. H;r:y:r:_:. # final transformation changes $_ to '_' print;exit} # so we print symetrical '_' and exit

    Recursion and goto what a choice combo to make spagetti

    cheers

    tachyon