Perl根据模板

时间:2015-07-17 06:33:05

标签: perl perl-module

我正在研究一个需要我根据模板生成.hpp文件的用例。像

这样的东西
#ifdef changethis_hpp
#define changethis_hpp

#include<fixedheader1>
...
#include<fixedheaderN>

class changethis
{
....
};

需要根据changethis字符串的要求生成。 我怎样才能在perl中实现这一目标?

WHITSF 我编写了一个固定的template.txt文件,然后将文本替换为changethis字符串,然后将其作为changethis.hpp转储。

但是有没有其他方法可以在perl中实现这个目标?

2 个答案:

答案 0 :(得分:4)

有一个Perl常见问题解答How can I expand variables in text strings?。它是这样开始的:

  

如果你可以避免它,或者你可以使用模板系统,   例如Text::TemplateTemplate工具包,请执行此操作。   您甚至可以使用sprintfprintf

完成工作
my $string = sprintf 'Say hello to %s and %s', $foo, $bar;
     

但是,对于一次性的简单案例,我不想退出   完全模板系统,我将使用一个具有两个Perl标量的字符串   变量在里面。在此示例中,我想将$foo$bar扩展为   他们的变量值:

my $foo = 'Fred';
my $bar = 'Barney';
$string = 'Say hello to $foo and $bar';
     

我可以这样做的一种方法是使用替换运算符和双/e   旗。第一个/e评估替换方$1并转换它   进入$foo。第二个/e$foo开头,并将其替换为$foo   值。然后,$string =~ s/(\$\w+)/$1/eeg; # 'Say hello to Fred and Barney' 变成了弗雷德&#39;这就是最后剩下的东西了   字符串:

/e
     

/e也会默默地忽略违反严格替换的行为   带有空字符串的未定义变量名。因为我正在使用$foo   flag(偶数两次!),我遇到了所有相同的安全问题   eval的字符串形式。如果@{[ system "rm -rf /" ]}中有一些奇怪的东西,也许吧   像var settings = ... setTimeout(function() { void(0);document.getElementById... }, YOUR_TIMEOUT_IN_MILLISECS);这样的东西,然后我可以自己进去   麻烦。

我强烈建议您忽略大部分建议并直接进入模板系统(如第一行所述)。

答案 1 :(得分:1)

我使用Text::Template来执行此类任务。