I liked the starting principle here...but then it got a bit silly and golfy :) Not hard to understand, but takes a little to untangle.
$japh='AJPJAjajHAJPHAJaaJPAjJajAJaaJPAJHJAjJAjaJHPAJhaAJAJPJAJaaJPAjJA +JpaaaJHaAJ'; $japh=~s/$_/uc($_ x2)/eg for(split(//,'japh')); print join(' ',reverse map{ucfirst lc}split('@',join('',map{split(//); chr(eval join'+',map{index('JAPH',shift(@_))<<($_*2)}map{index('JAPH', +$_)}reverse split(//,'JAPH'))}$japh=~m!(....)!g)));
Enjoy. Ben.