13

四个非常相同的正则表达式。我用以下标量值替换字符串。这怎么能更有效率?

$line =~ s/\[(receiver)\]/$receiver/g;
$line =~ s/\[(place)\]/$place/g;
$line =~ s/\[(position)\]/$position/g;
$line =~ s/\[(company)\]/$company/g;

谢谢你。

4

4 回答 4

19

考虑只使用真正的模板系统。 例如,模板工具包非常简单。

撇开这一点不谈,你说你希望它更有效率。它目前的低效率是一个问题吗?如果没有,请不要理会它。

您可以一次性完成所有操作:

my %subst = (
    'receiver' => $receiver,
    'place'    => $place, 
    'position' => $position,
    'company'  => $company,
);
$line =~ s/\[(receiver|place|position|company)\]/$subst{$1}/g;

但是,例如,如果$receiver是“地方”,这将采取不同的行动。

于 2012-10-21T06:34:35.300 回答
3

好的,让我们看看,你想要什么:

如果你想“评估”变量的值,你在字符串中找到的那个名字,那么,你需要:

my $receiver = 'rcv';
my $place = 'plc';
my $position = 'pstn';
my $company = 'cmpn';
my $allVariableNames = join('|',qw(receiver place position company));
$line = '[receiver]';
$line =~ s/\[($allVariableNames)\]/'$'.$1/eg;
#$line =~ s/\[($allVariableNames)\]/eval('$'.$1)/eg; <- smarter and shorter variant
print $line,"\n"; #contain $receiver
print eval($line), "\n";   # evaluate ($receiver) => get rcv

这是完成此任务的另一种方法,请参阅上面的ysth答案

于 2012-10-21T09:44:07.627 回答
1

对于组合正则表达式,你真的想看看Regexp::Assemble

更新:也许一个更完整的例子是为了:

my %subst = (
    'receiver' => 'rcv',
    'place'    => 'plc',
    'position' => 'pos',
    'company'  => 'cpy',
);

my $re = Regexp::Assemble->new->add(keys %subst);

my $str = "this is the receiver: [receiver] and this is the place: [place]";

$str =~ s/(?:\[($re)\])/$subst{$1}/g;
于 2012-10-21T07:21:06.830 回答
0

我得到这个:

/\[(receiver|place|position|company)\]/${"$+"}/ge;

$receiver $place $position $company 应该是全局变量(我们的)

于 2012-10-25T02:13:27.913 回答