Perl:我可以在变量中存储反向引用(而不是它们的值)吗?

时间:2009-12-15 15:21:55

标签: regex perl

我想做这样的事情:

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')

还有其他想法可以做到这一点吗?

非常感谢。

3 个答案:

答案 0 :(得分:12)

您可以使用/ee评估并扩展字符串:

my $text = "The owls are not what they seem.";
my $pattern = '(\s+)';
my $replacement = q{"-$1-"};
$text =~ s/$pattern/$replacement/eeg;

来自perldoc perlop

  

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;