四个非常相同的正则表达式。我用以下标量值替换字符串。怎么能更有效率?
$line =~ s/\[(receiver)\]/$receiver/g;
$line =~ s/\[(place)\]/$place/g;
$line =~ s/\[(position)\]/$position/g;
$line =~ s/\[(company)\]/$company/g;
谢谢。
答案 0 :(得分:19)
考虑使用真正的模板系统。例如,Template Toolkit非常容易。
暂且不说,你说你希望它更有效率。它目前认为的低效率是一个问题吗?如果没有,请不要管它。
你可以一次性完成所有这些:
my %subst = (
'receiver' => $receiver,
'place' => $place,
'position' => $position,
'company' => $company,
);
$line =~ s/\[(receiver|place|position|company)\]/$subst{$1}/g;
但是,如果$receiver
是'place',这将采取不同的行动。
答案 1 :(得分: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 '回答
答案 2 :(得分: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;
答案 3 :(得分:0)
我得到以下内容:
/\[(receiver|place|position|company)\]/${"$+"}/ge;
$ receiver $ place $ position $ company应该是全局变量(我们的)