Here's my attempt to do the same thing. The same restrictions apply to my code. Hope you enjoy it!
Note: I have taken a few liberties in my code: I have changed the format of the "header", because I like qw, and I have changed the word warn to die.
use strict; use warnings;
@_=my @hidden_words_to_find=qw(
PERL USESTRICT ARRAY SUBROUTINE
EXIT CPAN FOREACH MODULUS BLESS
WHILE PERLMONKS PRINT SCALAR IF
REGEX ELSE DIE LENGTH HASH JAPH
);$_='
P X U S E S T R I C T G L A F I
I E E R Z I A P S Z R E E I D N
X A R R A Y E K E D J D L D X J
D F S L W M N C J C E R I C E R
U H F C M O N L E N G T H I D O
M R X H M H Z W I E R X W A S D
H E Y L C E S T R V H W D E W Q
E G R X W M U A D F E G E L S E
C E M J F O R E A C H T R H E C
P X U H R D T Y R P Y N B X P B
W C B B Z U E S C A E A C V R E
D F U V D L S A C N B V Y A I T
S S E L B U B H E W S D L N N D
A D X G E S F K S J G A R T T F
F G I E B N S B Z A C W Q U E A
S D T G A E R N N S H P A J Q D
';print;s/\n/--/g;for$/(1,30,32
,34){for$.(@_,map{reverse.""}@_
){my$x;$"=join"(.{$/})",split//
,$.;$0="";s|$"|join"",map{(eval
"\$@{[$x++]}") .$_}split//,lc$.
|gei;}}s/-{2}/\n/g;s/[A-Z]/ /g;
print"Locations:";print;__END__