我正在使用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
答案 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";