Passing regular expressions as arguments to subroutines
Anonymous Monk
created: 2005-11-02 17:57:48
Let's say I wanted to pass a regex to a sub. How can I do this and validate the regex at the same time?

For example, sub('/turtle|fish/i') and then in the sub, I would have:

sub {
# After validating that the regex is really a regex.
my $string = 'fish';
print "hello" if ($string =~ $_[0]); # prints hello
}
Re: Passing regular expressions as arguments to subroutines
created: 2005-11-02 18:03:24
Something like:

my $a = qr/turtle|fish/i;
foo($a);

sub foo{
    my $reg = shift;
    if(ref($reg) eq 'Regexp'){
       my $string = 'fisH';
       print "hello" if ($string =~ $reg);
    }
}
Re: Passing regular expressions as arguments to subroutines
created: 2005-11-02 18:31:19

'/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 [doc://perlop|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.

Re^2: Passing regular expressions as arguments to subroutines
created: 2005-11-02 19:24:48
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';

perlmonks.org content © perlmonks.org and Anonymous Monk, ikegami, ioannis, johnnywang

prlmnks.org © 2006 edmund von der burg (eccles & toad)

v 0.03