http://www.perlmonks.org?node_id=1199079

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

Hi Monks!
If I have the following code:
$myvar="one"; $string="oneREC:riugfryfgfyug";

and I want to do this pattern matching:
if($string=~/^$myvarREC:(.*)/)

it does not work because REC is right after the value of $myvar. Only if I separate them, e.g. $string="one#REC:riugfryfgfyug";
it does the pattern matching. Can you tell me what I am doing wrong?

Replies are listed 'Best First'.
Re: How do you use a variable value within a regular expression pattern properly? (updated)
by haukex (Archbishop) on Sep 11, 2017 at 11:43 UTC

    As an alternative to what 1nickt showed, there's also the /x modifier that allows you to insert whitespace in your regex, which also improves readability:

    if( $string=~/ ^ $myvar REC: (.*) /x )

    Also, Mind the meta!, that means if your $myvar contains any characters like the dot (.) and you don't want these to be interpreted as regex special characters, or any whitespace in the variable to be ignored under /x, then you need to wrap your string in \Q...\E (see also quotemeta):

    if( $string=~/ ^ \Q$myvar\E REC: (.*) /x )

    Update: Added links to docs. Also added bit about whitespace in the variable under /x.

    Update 2: Just to be clear, I recommend you always use \Q...\E, even if you don't use /x, unless you specifically want regex metacharacters in $myvar to be treated as such and it comes from a trusted source! That is, if($string=~/^\Q$myvar\EREC:(.*)/)

Re: How do you use a variable value within a regular expression pattern properly?
by 1nickt (Canon) on Sep 11, 2017 at 11:30 UTC

    Use braces, like: "${myvar}REC".


    The way forward always starts with a minimal test.
      Thank you very much!