perl regex:用模板中的可变内容替换占位符

时间:2014-03-06 13:14:48

标签: regex perl

我有一些模板字符串和一些变量。 例如以下内容:

my $template = " text <--Name--> some other text <--Age--> ...";
my $age = 15;
my $name = "heinz";

使用相应的perl变量替换模板占位符字符串的正确Regex是什么?

我试过

$template =~ s/<--(.*?)-->/eval('$' . lc($1))/sge;

但它不起作用。占位符由空字符串替换。 我希望有人有个主意。 提前谢谢。

3 个答案:

答案 0 :(得分:4)

使用哈希,

my $template = " text <--Name--> some other text <--Age--> ...";
my %hash = (age => 15, name => "heinz");

$template =~ s/<--(.*?)-->/$hash{"\L$1"}/g;

答案 1 :(得分:1)

您正在做的事情完全由Template::Toolkit模块提供。但是,您的代码与您显示的代码完全一样

use strict;
use warnings;

my $template = " text <--Name--> some other text <--Age--> ...";
my $age      = 15;
my $name     = "heinz";

$template =~ s/<--(.*?)-->/eval('$' . lc($1))/sge;

print $template, "\n";

<强>输出

 text heinz some other text 15 ...

但最好使用哈希并将所有数据保存在同一个地方。它还避免使用评估替换

use strict;
use warnings;

my $template = " text <--Name--> some other text <--Age--> ...";

my %data = (
  age  => 15,
  name => 'heinz',
);

$template =~ s/<--(.*?)-->/$data{lc $1}/sg;

print $template, "\n";

答案 2 :(得分:0)

正如其他人已经说过的,正确的方法是使用哈希。但是,如果由于某种原因您无法或不愿意这样做,那么至少您需要使正则表达式的左侧更具限制性,以便只捕获变量名称而不是随机代码。

The Syntax of Variable Names给出了perl变量名的明确规则,但事实是我怀疑你并不真的需要包变量等,所以继续使它更加相应。

use strict;
use warnings;

my $template = " text <--Name--> some other text <--Age--> ...";
my $age = 15;
my $name = "heinz";

$template =~ s/<--\s*([a-zA-Z_]\w*)\s*-->/'$' . lc($1)/sgee;

print $template;

最后,可以在正则表达式中使用多个e修饰符,因此您实际上不需要在正则表达式的LHS中包含显式eval。