in reply to Re^2: how to restrict a regexp?
in thread how to restrict a regexp?

Thanks for your answers. I have now wrapped the regexp in a block with "no re 'eval'" at start. It is then further wrapped in a nested eval block with an alarm set to avoid the exponetial time issue.

Replies are listed 'Best First'.
Re^4: how to restrict a regexp?
by Your Mother (Archbishop) on Mar 17, 2008 at 16:47 UTC

    This came up here quite awhile back and at that time someone pointed out that alarm/sleep would not work in this context. During the regex execution they were suspended. I do not know if this is still the case as the regex engine got a pretty major overhaul since then and the internal details were beyond me at the time.

Re^4: how to restrict a regexp?
by ikegami (Patriarch) on Mar 17, 2008 at 23:45 UTC

    It is then further wrapped in a nested eval block with an alarm set to avoid the exponetial time issue.

    I was going to say that won't work because the signal won't be processed until after the match or substitution operator is done when using safe signals. Turns out it does.

    $ date; perl -e'"aaaaaaaaaaaaaaaaaaaaaa" =~ /a?a?a?a?a?a?a?a?a?a?a?a?a +?a?a?a?a?a?a?a?a?a?[b]/;'; date Mon Mar 17 16:44:46 PDT 2008 Mon Mar 17 16:44:54 PDT 2008 $ date; perl -e'alarm(1); "aaaaaaaaaaaaaaaaaaaaaa" =~ /a?a?a?a?a?a?a?a +?a?a?a?a?a?a?a?a?a?a?a?a?a?a?[b]/;'; date Mon Mar 17 16:45:02 PDT 2008 Alarm clock Mon Mar 17 16:45:03 PDT 2008

    Make sure to test this with your Perl. Use any equal number of "a"s and "a?"s as long as Perl takes more than 1 sec to execute the match. (You can Ctrl-C if it takes too long.)

    I have now wrapped the regexp in a block with "no re 'eval'" at start.

    Just to be clear, no re 'eval'; is the default so it's not needed, but it sure is a good practice to include it here.