Perhaps that title would benefit from perl -ne "$_=~s/(\));/;\1/;print"

Just for fun I was looking at perl58.dll from Strawberry Perl in a hex editor. I guess that shows how obfuscated my brain was at the time. Anyhow, I got inspired to write this JAPH. Golfers might be able to get it shorter.

@z=('"my %h;1 if defined(%h);"','"my %h=(c=>0);*ENV=\\%h;system(\'echo + $ENV{c}\');"','"require v9;"', '"my $b=0;$b->d();"');$s=sub{($c,$p)=@_;$c='perl -WTe '.$c.' 2>&1';$e= +`$c`;@w=split/ /,$e;$w[$p]}; %l=(0,9,1,4,2,0,3,[4,6]);$\=' ';print &$s($z[$_],$l{$_})for(0..2);unde +f $\;$o='';$o.=&$s($z[3],$l{3}[$_]) for(0..1);@o=$o=~/./g;print $o[3],@o[8..10];$o=&$s($z[2],5);@o=$o=~/./ +g;print $o[-1]

Update: added the space requested by jdalbec.

Update: ++LassiLantar and jdalbec and thanks for the alternate versions. I done some more research and found

this re: "quoting on non-Unix systems" in perlrun
On some systems, you may have to change single-quotes to double ones, which you must not do on Unix . . .

and later:
There is no general solution to all of this. It's just a mess.

That'll teach me to use a platform dependent feature to base my japh on. Back to "standard" (non-obfu) coding . . .


I humbly seek wisdom.

Replies are listed 'Best First'.
Re: There are errors in this JAPH );
by jdalbec (Deacon) on Nov 04, 2007 at 01:57 UTC

      Sorry about that. I admit to having a blindspot in Macs. I don't have one and don't have access to one at work. Per your inquiry:


      I humbly seek wisdom.
Re: There are errors in this JAPH );
by LassiLantar (Monk) on Nov 06, 2007 at 07:24 UTC

    This JAPH is lovely, but I haven't a Perl environment in which it works as written. Here's a bit of analysis and a fix which makes it work on my system.

    From my Linux box (Ubuntu 7.10), Perl v5.8.8, the output is:

    just another Perl e,

    And in Windows, under both ActivePerl and Strawberry, I get:

    just Perl hack,

    as per jdalbec's comment.

    The problem under Linux seems to be that:

    perl -WTe "my $b=0;$b->d();" 2>&1
    fails with:
    syntax error at -e line 1, near "my ="
    rather than the desired:
    Can't call method "d" without a package or object reference at -e line + 1.
    This can be fixed by changing the double quotes to single quotes, in the declaration of @z, making $z[3] be:
    '\'my $b=0;$b->d();\'');
    With this change, the output becomes:
    just another Perl hack,
    It seems to my fairly vague understanding that this was the intended output, given the code posted. Here's a version which (although a little verbose for a JAPH), on my Linux system, prints  just another Perl hacker,. I haven't worked one out for the Windows side.
    @z=('"my %h;1 if defined(%h);"','"my %h=(c=>0);*ENV=\\%h;system(\'echo + $ENV{c}\');"','"require v9;"','\'my $b=0;$b->d();\'');$s=sub{($c,$p) +=@_;$c='perl -WTe '.$c.' 2>&1';$e=`$c`;@w=split/ /,$e;$w[$p]};%l=(0,9 +,1,4,2,0,3,[4,6]);$\=' ';print $m=&$s($z[$_],$l{$_})for(0..2);undef $ +\;$o='';$o.=&$s($z[3],$l{3}[$_])for(0..1);@o=$o=~/./g;print $o[3],@o[ +8..10];@o=$m=~/./g;print @o[1..2];$o=&$s($z[2],5);@o=$o=~/./g;print $ +o[-1];
    I can't say I'm sure why it is that the double quotes are causing so much trouble. It seems to me that the $b inside a double quoted string literal is being translated as the value of $b and thus the code being run is actually:
    my undef=0;undef->d();
    Which (obviously) causes a syntax error. Am I interpreting correctly? Edit: Indeed, I am interpreting correctly, now that I re-read jdalbec's earlier post.