in reply to Comparing two variables when one variable includes a regexp...

Your problem appears to be that $NetPattern doesn't contain the slashes you think it does. You have two choices:
$NetPattern = qr{mbist[\w+\d+\/]*\[\d+\]}x; if ($NetName =~ $NetPattern) {# Do fantastical things...}
$NetPattern = 'mbist[\w+\d+\/]*\[\d+\]'; if ($NetName =~ qr/$NetPattern/x) {# Do fantastical things...}

The "" style quotes interpolated your slashes away.

The qr is also most useful (in my opinion) for precompiling regular expressions, so I would choose the first solution, particularly if you have a lot of matches to do on that single regular expression. It's also nice for being able to tell that $NetPattern is of type Regexp. So, I guess there's also this third choice...

$NetPattern = 'mbist[\w+\d+\/]*\[\d+\]'; if ($NetName =~ m/$NetPattern/x) {# Do fantastical things...}

-Paul

Replies are listed 'Best First'.
Re^2: Comparing two variables when one variable includes a regexp...
by Narveson (Chaplain) on May 01, 2008 at 18:25 UTC

    Surely all these replies that fix one example out of an infinite number of possible user inputs are missing the point?

    If I understood the original post, $NetPattern is to be read from the command line, so the example, mistaken bracketing and all, was just an example. The question was

    If a user enters a command-line regular expression that gets pushed into a variable, what is the most reliable way to use that variable to compare it against another variable that is a string?

    In our answers, we should be explaining how to validate a user-supplied string before interpolating it into a regex. A simple error like [ without matching ] is the least of our worries.

      That's an excellent point actually. I'll amend my answer, although I covered it somewhat. Assuming you actually trust the user, this seems like a sane way to do it.
      my $regexp = <$file_handle>; my $creg = eval { qr($regexp) }; if( $@ ) { warn "regex error: $@"; } else { if( $something =~ $creg ) { # do wonderful things. } }

      I apparently skipped the meat of the question because it seemed clear to me that the reason the matching failed was because of an interpolation problem with a test regexp that he generated between quotes and he wasn't actually reading it from the user -- which would have likely worked the way he had it.

      -Paul