Is there a way to precompile a regex in Perl?

后端 未结 3 2076
刺人心
刺人心 2020-12-08 14:11

Is there a way to precompile a regex in Perl? I have one that I use many times in a program and it does not change between uses.

相关标签:
3条回答
  • 2020-12-08 14:47

    For literal (static) regexes there's nothing to do -- perl will only compile them once.

    if ($var =~ /foo|bar/) {
        # ...
    }
    

    For regexes stored in variables you have a couple of options. You can use the qr// operator to build a regex object:

    my $re = qr/foo|bar/;
    
    if ($var =~ $re) {
        # ...
    }
    

    This is handy if you want to use a regex in multiple places or pass it to subroutines.

    If the regex pattern is in a string you can use the /o option to promise perl that it will never change:

    my $pattern = 'foo|bar';
    
    if ($var =~ /$pattern/o) {
        # ...
    }
    

    It's usually better to not do that, though. Perl is smart enough to know that the variable hasn't changed and the regex doesn't need to be recompiled. Specifying /o is probably a premature micro-optimization. It's also a potential pitfall. If the variable has changed using /o would cause perl to use the old regex anyway. That could lead to hard to diagnose bugs.

    0 讨论(0)
  • 2020-12-08 14:54

    for clarification, you can user precompiled regex as:

    my $re = qr/foo|bar/;  #precompile phase
    if ( $string =~ $re ) ...   #for direct use
    if ( $string =~ /$re/ ) .... #the same as above but a bit complicated
    if ( $string =~ m/something $re other/x ) ...  #for use precompiled as a part of bigger regex
    if ( $string =~ s/$re/replacement/ ) ...  #for direct use as replace
    if ( $string =~ s/some $re other/replacement/x ) ... #for use precompiled as a part of bigger, and as replace all at once
    

    It is documented in perlre but there are no direct examples.

    0 讨论(0)
  • 2020-12-08 14:57

    Simple: Check the qr// operator (documented in the perlop under Regexp Quote-Like Operators).

    my $regex = qr/foo\d/;
    $string =~ $regex;
    
    0 讨论(0)
提交回复
热议问题