After removing comments and adding a little whitespace, we can explain the rest of the program:
"-|=I+X#."; # A nice string in void context eval reverse ';)1,52,1,2,2,32,97(=)i$,n$,z$,h$,w$,H$,W$(;".#X+I=|-" '; # default variables initialization # Read the command-line parameters (but there are none?!) while (@ARGV) { ${ pop @ARGV } = pop } do { # A big loop (explained later) while (/([a-z])\s*([-\d.]*)/cgi) { ${$1} = $2 if $1 } $e = $_; $_ = qq#'<$W%;<$H%(<$j%[<$w%|<$h%!<$x%=<$y}_<$A%^<$a%*<$z%:<$n\n]@//^:")%#; @c = split //, $00; for ( 1 .. $i ) { $w *= $z; $h *= $z; $A += $a; for ( 0 .. $H * $W - 1 ) { ( $U, $R, @0 ) = ( f( $_ % $W, int $_ / $W ), $n ); ( $p, $q ) = ( $j ? ( $x, $y ) : ( $U, $R ) ); do { ( $U, $R ) = ( $U * $U - $R * $R + $p, $U * 2 * $R + $q ) } until ( ( $U * $U + $R * $R > 4 ) || --$0[0] == 0 ); print $c[ int( $0[0] * 9 / $n ) ], ++$_ % $W ? $# : "\n"; } } sub f { ( $w / $W * ( $_[0] - ( $W - 1 ) / 2 ) * cos($A) + $h / $H * ( ( $H - 1 ) / 2 - $_[1] ) * sin($A) + $x, ( $_[0] - ( $W - 1 ) / 2 ) * -$w / $W * sin($A) + $h / $H * ( ( $H - 1 ) / 2 - $_[1] ) * cos($A) + $y ); }; exit if $e =~ /q/; BEGIN { push @ARGV, split ' ', $ENV{TPJ} }; # User preferences s/}/%X<$X%Y<$Y%/; y"=_!'<%:/;[^]@|*)\"({"yAxW= nmHwaCohz:dju"; print; } while (<>)
We have two while loops. Let's explain the short one:
Copyright © 2000-2001, Philippe "BooK" Bruhat.