0

我想使用变量作为 perl (s//) 中的替换文本?显然,以下代码不起作用。有没有办法做我想做的事?

~$  ./subsuffix.pl 
xxx_$1_outsuffix.txt

subsuffix.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';

#result of the following is what I expect
#$filename =~ s/$insuffix$/_$1_outsuffix.txt/;
#But I want used a variable as the substitution text. 
#Unfortunately, the following do not work.
$filename =~ s/$insuffix$/$outsuffix/;
print "$filename\n";
4

3 回答 3

4

替换通常不会被评估。您必须/e在替换末尾添加几个 's 并添加一些引号以使其在第一次评估后保持有效表达式:

$filename =~ s/$insuffix$/qq("$outsuffix")/ee;
于 2013-04-04T15:52:24.147 回答
3

您可以使用/e修饰符将替换模式视为要评估的代码:

$filename =~ s/$insuffix$/ "_" . $1 . "_outsuffix.txt" /e;
于 2013-04-04T15:57:58.867 回答
2

你所拥有的$outsuffix是一个模板。模板不会神奇地处理自己。您需要调用处理器。String::Interpolate可以理解你的模板。

use String::Interpolate qw( interpolate );

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

$filename =~ s/$insuffix$/interpolate($outsuffix)/e;
print "$filename\n";
于 2013-04-04T17:50:25.873 回答