Perl正则表达式插值

3

我有一些代码:

$a = 'abcdef';
$b = 'f\1d';
$a =~ s/d(e)f/$b/g;
print $a;

我得到的是abcf\1d,但我该如何获得abcfed
2个回答

5
$a = 'abcdef';
$b = '"f$1d"';
$a =~ s/d(e)f/$b/gee;
print $a;

请注意,在/gee中有两个e修饰符;第二个修饰符将"f$1d"字符串评估为fed
顺便提一下,由于您只替换了一个模式出现,因此不需要使用/g

为什么我需要写 '"f${1}d"'?为什么 'f${1}d' 会返回错误? - michaeluskov
@user23791,出现了错误,因为f${1}d不是有效的Perl代码,而你正在要求Perl像解释器一样对其进行解释。 - mpapec
дљЖжШѓдЄЇдїАдєИ $b = 'f${1}d'; $a =~ s/d(e)f/"$b"/gee; дЉЪињФеЫЮйФЩиѓѓпЉЯ - michaeluskov
由于相同的原因,@user23791,“foo bar”无法通过perl编译,而“"foo bar"”可以。并且提到的字符串必须是有效的perl代码。 - mpapec
不需要花括号。1d不是一个有效的标识符,所以Perl会正确消除歧义,my $b = '"f$1d"'是可以的。 - Borodin

2

$a$b 是用于排序的特殊变量,因此您不应该使用它们。

更好的解决方案是使用另一个变量,然后进行操作:

$var_a = 'abcdef';
$var_b = '"f${1}d"';
$var_a =~ s/d(e)f/$var_b/gee;
print $var_a;

诀窍在于说,替换使用第一个找到的变量\1(使用/e标志可避免使用\1 :P)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接