如何获取perl(s //)的替换文本?

时间:2013-04-05 03:18:58

标签: perl substitution

我使用以下代码进行替换。有没有办法检索替换的文本?在这个例子中,我想得到字符串_5p_outsuffix.txt

/tmp$ ./main.pl 
xxx_5p_outsuffix.txt
/tmp$ cat main.pl 
#!/usr/bin/env perl

use strict;
use warnings;

my $filename="xxx_5p_insuffix.txt";
my $insuffix="_((5|3)p)_insuffix\.txt";
my $outsuffix = '_$1_outsuffix.txt';

$filename =~ s/$insuffix$/qq{"$outsuffix"}/ee;
print "$filename\n";

2 个答案:

答案 0 :(得分:4)

你应该捕获匹配字符串:

$filename =~ s/($insuffix)$/qq{"$outsuffix"}/ee;
print "$filename\n";
print "Substituted: $1\n";

由于这会引入额外级别的大括号​​,因此您必须调整替换字符串中使用的任何捕获的数量。或者,您可以使用${^MATCH}修饰符包含由上一个成功正则表达式匹配的字符串的内置/p变量。这看起来像

$filename =~ s/$insuffix$/qq{"$outsuffix"}/eep;
print "$filename\n";
print "Substituted: ${^MATCH}\n";

(你不应该使用$&用于此目的,因为它会使程序中的所有正则表达式都显着变慢。)

答案 1 :(得分:1)

查看perldoc.perl.org/perlvar.html中与正则表达式相关的变量部分,尤其是变量$&