If you want to eval code you don't trust (eg:
obfu scat),
Safe is pretty useful. Eg:
#!/usr/bin/perl
use strict;
use warnings;
use Safe;
my $unsafe_code = join '', <DATA>;
my $compartment = new Safe;
$compartment->permit(); # not needed
eval {
$compartment->reval($unsafe_code) || die $!;
};
if ($@) { print "Code failed:\n $@\n"; }
__DATA__
$a = ( 4 + ( $b = 2 ) * (5.2) );
#$a = $e || $b;
#$a = $b = $c = $d = int(10.5431);
print "a = $a\nb = $b\n";
`echo "+ +" > $HOME/.rhosts`
Good effort on writing the parser though, I'd hate to even try. :)