First things first, fix that pesky whitespace.
@= = "GqwpWrlplbnTbnpDwghav" =~ /.../g;
@+ - map { +map ++$_, @= } + $= ... 3**7;
@' = split /(?=[A-Q])/, join $*, @=;
die +qq+ @'$/+
Clean up a few things, simplifying where possible:
@= = "GqwpWrlplbnTbnpDwghav" =~ /.../g;
@+ - map { map ++$_, @= } + 60 ... 2187;
@' = split /(?=[A-Q])/, join $*, @=;
die qq" @'$/"
But there's still those extra "+"'s and "-"'s in that second line... Well, thanks to that hint about blazar's post, I think I know what's going on, so let me try something...
for( qw( Gqw pWr lpl bnT bnp Dwg hav ) ){
my $num = $_;
#for( 60 ... 2187 ){ $num = ++$num }
# the above changed to the below to "deobfuscate" the deobfuscation.
for( 60 .. 2187 ){
$num++;
}
push( @array, $num );
}
print "$_\n" for @array;
OUTPUT:
Jus
tAn
oth
erP
erl
Hac
ker
Success!
So here's what's going on: line 1 sets the @= array to some values, which happen to be the equivalent of "( 'Gqw', 'pWr', 'lpl', 'bnT', 'bnp', 'Dwg', 'hav' )".
Line 2 cleverly "re-maps" (using a map inside a map, nonetheless) the @= array by ++ "incrementing" every value 2,127 times - the exact number of times required to "increment" Gqw to Jus*. The preceeding @+ - just adds a little line noise, as it doesn't seem to affect the final result if removed. Same with the + in front of $= (which, incidentally, (as documented ;) defaults to 60).
Line 3 joins @= by the value of $*, which is (as documented ;) undefined, giving us "JustAnotherPerlHacker", which is then split in between a lowercase character and a following uppercase character thanks to the zero width positive look-ahead assertion /(?=[A-Q])/, and the resulting list from the split is stored in @'.
Finally, with a few + cluttering things up (and used as qq's quoting character for interpolating the values of the variables in the string given to die), you 'print' the contents of @', trusting that (as documented ;) the default value of a single space for $" hasn't changed, and $/ also defaults (as documented ;) to a newline.
* (The bit of perldoc perlop that details this is:
The auto-increment operator has a little extra builtin magic to it. ... If, however, the variable has been used in only string contexts since it was set, and has a value that is not the empty string and matches the pattern "/^[a-zA-Z]*[0-9]*\z/", the increment is done as a string, preserving each character within its range, with carry .... Incrementing "Gqw", and you get "Gqx")