我有以下代码,它使用$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
修饰符也可以这样做。但是,您不应该使用它,因为它可能会导致安全问题和各种错误。