我有一些模板字符串和一些变量。 例如以下内容:
my $template = " text <--Name--> some other text <--Age--> ...";
my $age = 15;
my $name = "heinz";
使用相应的perl变量替换模板占位符字符串的正确Regex是什么?
我试过
$template =~ s/<--(.*?)-->/eval('$' . lc($1))/sge;
但它不起作用。占位符由空字符串替换。 我希望有人有个主意。 提前谢谢。
答案 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。