Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation
 
PerlMonks  

Passing regular expressions as arguments to subroutines

by Anonymous Monk
on Nov 02, 2005 at 22:57 UTC ( [id://505167]=perlquestion: print w/replies, xml ) Need Help??

Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

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 }

Replies are listed 'Best First'.
Re: Passing regular expressions as arguments to subroutines
by johnnywang (Priest) on Nov 02, 2005 at 23:03 UTC
    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
by ikegami (Patriarch) on Nov 02, 2005 at 23:31 UTC

    '/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.

      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';

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://505167]
Approved by johnnywang
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others admiring the Monastery: (1)
As of 2024-04-25 01:23 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found