in reply to Passing regular expressions as arguments to subroutines

'/turtle|fish/i' is a Perl expression, not a regular expression. turtle|fish and (?i-xsm:turtle|fish) are (Perl) regular expressions. Since '/turtle|fish/i' is Perl, you'd need eval to execute it. So you need to pass just the regular expression ((?i-xsm:turtle|fish)) or precompile it with qr// (qr/turtle|fish/i).

For example,

$uncompiled_re = '(?i-xsm:turtle|fish)'; mysub($uncomiled_re); $compiled_re = qr/turtle|fish/i; mysub($comiled_re);

Strings get tricky when \ is used, but qr// doesn't. For example,

$uncompiled_re = "(?i-xsm:\\w)"; mysub($uncomiled_re); $compiled_re = qr/\w/i; mysub($comiled_re);

The documented usage is
$string =~ /$re/
whether $re contains a string or a compiled regexp, but I think
$string =~ $re
works in both cases.

Replies are listed 'Best First'.
Re^2: Passing regular expressions as arguments to subroutines
by ioannis (Abbot) on Nov 03, 2005 at 00:24 UTC
    The only reason the subroutine must only accept a regex is because that is the requirement imposed by the problem. Without such restriction, the subroutine could also accept a string (in which case, one easy way to validate would likely involve an eval() ).

    The code, $string =~ $re ;, will work in both cases:

    1. when $re is of type Regexp, as in $re=qr/\w/i,
    2. when $re is just a scalar for a string, as in
      • $re = '(?i-xsm:\w)', or
      • $re = '\w';