Regex Group:在替换发生之前,字符串中的$1



我有以下代码,它使用$1:用字符串的一部分替换字符串

my $string = "abcd1234";
print "$stringn";

$string =~ s/c(d1)2/<found: $1>/; 
print "$stringn";

输出:

abcd1234
ab<found: d1>34

现在我想要变量,其中包含条件和替换。但如果我这样做,就会出现一个错误:

my $string = "abcd1234";
print "$stringn";

my $cond = qr/c(d1)2/;
my $rule = "<found: $1>";

$string =~ s/$cond/$rule/; 
print "$stringn";

输出:

Use of uninitialized value $1 in concatenation (.) or string
abcd1234
ab<found: >34

我知道,$1不存在于定义了$rule的行中。但是如何在那里放置占位符呢?

不能像那样延迟对带引号字符串中变量的解释。一旦该行被执行,CCD_ 4就被替换。

要执行您想要的操作,您需要创建一个sprintf模板,并在替换的替换部分使用/e标志执行它。

my $string = "abcd1234";
print "$stringn";
my $cond = qr/c(d1)2/;
my $replacement_fmt= "<found: %s>";
$string =~ s/$cond/sprintf($replacement_fmt, $1)/e; 
print "$stringn";
## ab<found: d1>34

您可以从String::Substitution:使用sub_modify

use String::Substitution qw(sub_modify);
my $string = "abcd1234";
print "$stringn";

my $cond = qr/c(d1)2/;
my $rule = '<found: $1>';   # Single quotes!

sub_modify($string, $cond, $rule);
print "$stringn";

为了完整性,请注意,使用s////ee修饰符也可以这样做。但是,您不应该使用它,因为它可能会导致安全问题和各种错误。

最新更新