Perl正则表达式 - 使用eval进行动态替换,文字$ 1用于替换

时间:2013-06-17 15:42:26

标签: regex perl eval substitution

我正在使用eval来处理动态替换正则表达式。 左侧的值捕获($ 1)未在正则表达式的右侧使用。 任何帮助将不胜感激。

#!/usr/bin/perl
use strict;

my $string = "test-txt";

# Attempt 1
my $regexp_m = '-(\S+)$';
my $regexp_r = '.$1';
my $string2 = eval{ $string =~ s/$regexp_m/$regexp_r/; return $string; };

# Attempt 2
my $regexp = 's/(\S+)$/.$1/';
my $string3 = eval{ $string =~ $regexp; return $string; return $string; };

print "Attempt 1: $string2\n";
print "Attempt 2: $string3\n";

exit;

输出: 尝试1:测试。$ 1 尝试2:测试。$ 1

1 个答案:

答案 0 :(得分:0)

作为daxim评论,this answer by Ysth包含一个解决方案。 Perl documentation表示您可以使用/ee正则表达式修饰符:

  

将右侧评估为字符串,然后评估结果。

Ysth将'".$1"'作为替换正则表达式的右侧。 /ee修饰符首先将此字符串计算为".$1"。之后,eval$1替换为第一个捕获组。

工作示例:

my $string = 'test-txt';
my $regexp_m = '-(\S+)$';
my $regexp_r = '".$1"';      # Note the double quotes, so it's a string in a string
$string =~ s/$regexp_m/$regexp_r/ee;
print "$string\n";