1

我正在使用 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

4

1 回答 1

2

正如 daxim 评论的那样,Ysth的这个答案包含一个解决方案。Perl 文档说您可以使用regex/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";
于 2013-06-17T16:08:53.163 回答