我想做这样的事情:
my $text = "The owls are not what they seem.";
my $pattern = '(\s+)';
my $replacement = '-$1-';
$text =~ s/$pattern/$replacement/g;
$ text应该是:The-owls- -are- -not- -what- -they- -seem。
但当然更像是: - $ 1-owls- $ 1-are- $ 1-not-$ 1-what- $ 1-they-$ 1-seem。
我尝试了各种反向引用($ 1,\ 1,\ g {1},\ g1)并且它们都没有 工作。 / e修饰符也不起作用。这有可能吗?
目的是使用如下所示的行更改对象内的某些文本: $ object-> replace('(。)oo','$ 1ar')
还有其他想法可以做到这一点吗?
非常感谢。
答案 0 :(得分:12)
您可以使用/ee
评估并扩展字符串:
my $text = "The owls are not what they seem.";
my $pattern = '(\s+)';
my $replacement = q{"-$1-"};
$text =~ s/$pattern/$replacement/eeg;
e
将右侧评估为表达式。
ee
将右侧评估为字符串,然后评估结果
然而,我会觉得
更安全my $replacement = sub { "-$1-" };
$text =~ s/$pattern/$replacement->()/eg;
但这一切都取决于你这样做的背景。
答案 1 :(得分:3)
SinanÜnür的解决方案可以工作,但它仍然要求替换字符串在某个时刻是程序内部的文字。如果替换字符串来自数据,那么你将不得不做一些更有趣的事情:
sub dyn_replace {
my ($replace) = @_;
my @groups;
{
no strict 'refs';
$groups[$_] = $$_ for 1 .. $#-; # the size of @- tells us the number of capturing groups
}
$replace =~ s/\$(\d+)/$groups[$1]/g;
return $replace;
}
然后像
一样使用它$text =~ s/$pattern/dyn_replace($replacement)/eg;
请注意,这也避免了eval
并允许使用/ g之类的修饰符。代码来自this Perl Monks node,但我写了那个节点,所以没关系:)
答案 2 :(得分:-3)
$ text = ~s / $ pattern / - $ 1- / g;