如何在perl脚本中替换变量选项

时间:2017-11-30 08:12:15

标签: perl replace

在perl文本中,替换非常简单和强大。 我想做一个带有变量替换的脚本,例如:

if ( $IgnoreCase ) {$opt = "gi"} else {$opt = "g"}

$string =~ s/$source/$replace/$opt;

结果:

  

Scalar找到了运营商的预期......

是否有可能做选项变量?

2 个答案:

答案 0 :(得分:13)

由于您可以在所有情况下使用/g

my $opt = $IgnoreCase ? "(?i)" : "";

$string =~ s/$opt$source/$replace/g;

perldoc perlre

中有关此主题的更多信息
  

一个或多个嵌入式模式匹配修饰符,对于模式的其余部分或封闭模式组的其余部分(如果有),将打开(或在前面加“ - ”时关闭)。

     

这对于动态生成的模式特别有用,例如从配置文件中读取的模式,从参数中获取的模式或在某个表中指定的模式。考虑一些模式想要区分大小写但有些模式不区分大小写的情况:不区分大小写的模式只需要在模式的前面包含(?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