如何在perl中将变量用作正则表达式修饰符?

liv*_*e75 8 regex perl dynamic case-sensitive modifier

我正在编写一个抽象函数,它将询问用户一个给定的问题,并根据给定的正则表达式验证答案.重复该问题,直到答案与验证正则表达式匹配.但是,我还希望客户端能够指定答案是否必须符合大小写.所以像这样:

sub ask {
    my ($prompt, $validationRe, $caseSensitive) = @_;
    my $modifier = ($caseSensitive) ? "" : "i";
    my $ans;
    my $isValid;

    do {
        print $prompt;
        $ans = <>;
        chomp($ans);

        # What I want to do that doesn't work:
        # $isValid = $ans =~ /$validationRe/$modifier;

        # What I have to do:
        $isValid = ($caseSensitive) ?
            ($ans =~ /$validationRe/) :
            ($ans =~ /$validationRe/i);

    } while (!$isValid);

    return $ans;
}
Run Code Online (Sandbox Code Playgroud)

Upshot:有没有办法动态指定正则表达式的修饰符?

Sla*_*ade 12

Upshot:有没有办法动态指定正则表达式的修饰符?

来自perldoc perlre:

"(?adlupimsx-imsx)""(?^ alupimsx)"一个或多个嵌入式模式匹配修饰符,对于模式的其余部分或其余部分打开(或关闭,如果前面加" - ")封闭模式组(如果有).

这对于动态模式特别有用,例如从配置文件读入,从参数中获取或在某个表中指定的模式.考虑一些模式想要区分大小写但有些模式不需要的情况:不区分大小写的模式只需要在模式的前面包含"(?i)".

这给了你一些东西

$isValid = $ans =~ m/(?$modifier)$validationRe/;
Run Code Online (Sandbox Code Playgroud)

在以这种方式接受用户输入时,请务必采取适当的安全预防措施.