在perl文本中,替换非常简单和强大。 我想做一个带有变量替换的脚本,例如:
if ( $IgnoreCase ) {$opt = "gi"} else {$opt = "g"}
$string =~ s/$source/$replace/$opt;
结果:
Scalar找到了运营商的预期......
是否有可能做选项变量?
答案 0 :(得分:13)
由于您可以在所有情况下使用/g
,
my $opt = $IgnoreCase ? "(?i)" : "";
$string =~ s/$opt$source/$replace/g;
中有关此主题的更多信息
一个或多个嵌入式模式匹配修饰符,对于模式的其余部分或封闭模式组的其余部分(如果有),将打开(或在前面加“ - ”时关闭)。
这对于动态生成的模式特别有用,例如从配置文件中读取的模式,从参数中获取的模式或在某个表中指定的模式。考虑一些模式想要区分大小写但有些模式不区分大小写的情况:不区分大小写的模式只需要在模式的前面包含(?i)。
答案 1 :(得分:6)
从the excellent answer稍微澄清Сухой27:
如您所见,您无法在s///
运算符的选项部分中使用变量(好吧,如果您使用eval
就可以,但这可能是一个非常糟糕的主意)。
但是,这不是获得正则表达式匹配选项的唯一方法。您还可以使用正则表达式字符串中的(?...)
语法 。例如,m/(?i)foo/
与m/foo/i
完全相同。请注意,/g
是一个稍微不同的选项类,因此您不能使用此选项。
但由于此(?...)
字符串只是正则表达式的一部分,因此您可以使用变量将其嵌入正则表达式中。
my $opt = $IgnoreCase ? "(?i)" : "";
$string =~ s/$opt$source/$replace/g;
有关详细信息,请参阅"Extended Patterns" in perldoc perlre。