in reply to Re: Can you check the syntax of a eval() before executing it?
in thread Can you check the syntax of a eval() before executing it?

Another, possibly sillier way would be to eval it into an anonymous subroutine:
my $coderef = eval "sub{$code}" or die "Error in code: $@"; $coderef->(); # execute the code
That way one wouldn't have to recompile the code, if you really need that kind of optimization. It is also quite possible that there is code that can't be evaled into a sub like this. But maybe it'll suffice. :)
You have moved into a dark place.
It is pitch black. You are likely to be eaten by a grue.

Replies are listed 'Best First'.
Re: Re: Re: Can you check the syntax of a eval() before executing it?
by ariels (Curate) on May 07, 2002 at 07:48 UTC

    ... and it still executes those pesky BEGIN blocks.

    Some days you just have to love Perl's DWIDM features.

      That is true. I can see no good way to avoid that, either. Something like:
      my $coderef = eval "BEGIN{goto skip;}sub { $code } BEGIN{skip: print ' +Skipped!'}";
      will not work. Not that I am sure it would be good if it did either... return and exit both also yield unsatisfying results, not surprisingly.

      However, if you are afraid that someone might execute harmful code, then that is a whole nother issue, and you will not be protected just by verifying the syntax (which was what I addressed). However, if you use Safe, and do like this:

      use Safe; my $compartment = new Safe; my $coderef = $compartment->reval("sub{$code}") or die "$@"; $coderef->(); # execute the code
      The Safe compartment will stop whatever you decide is harmful code even in BEGIN blocks.

      If the issue rather is that it is annoying that code will become executed, well then some kind of filter might be in place I guess. For instance, for nearly all applications I could think of (short of a perl editor of course) disallowing the word "BEGIN" in the input (possibly in special cases, like followed by braces) would not be a big problem, would it?

      It is definetely something to be aware of though. Good call. :)


      You have moved into a dark place.
      It is pitch black. You are likely to be eaten by a grue.