使用变量作为模板

时间:2018-04-11 19:08:51

标签: perl

我不知道如何命名我想做什么,我知道它很奇怪。

我有一个脚本和这个脚本的外部配置文件。我希望用户能够以可访问的形式选择变量本身。它就像模板一样。

脚本:

#!/usr/bin/perl -w
use strict;

my ($from, $to);
our $period;

require file.conf

$from = '2017-01-01';
$to   = '2017-04-12';

print $period;

open my $fh, '>>', 'file.txt' or die "Cannot open!";
print $fh join ("\n", $period));
close $fh;

file.conf

$period = "$from \- $to";
1;

预期产出:

2017-01-01 - 2017-04-12

同样的输出应该在file.txt中。这个解决方案不起作用,定义$ period有未定义的变量$ from和$ to。我想在不同的代码行中使用这一行。

这样的输出是否可能?我强调,这个想法是为那些不知道子程序,哈希甚至数组是什么的用户提供最美观和最简单的解决方案。

2 个答案:

答案 0 :(得分:5)

您正在尝试创建模板系统。相反,使用现有的。

use Template qw( );

my $from = '2017-01-01';
my $to   = '2017-04-12';

# Name of a file or reference to string containing the template.
my $template = \ "[% from %] - [% to %]";

my $vars = {
   from => $from,
   to   => $to,
};

my $tt = Template->new({ });
$tt->process($template, $vars)
   or die($tt->error());

答案 1 :(得分:0)

首先,我完全第二ikegami's answer - 听起来你正在寻找像Template::Toolkit这样的模板系统。虽然它的语法不完全是Perl,但是从你所写的内容来看,听起来你的用户并不是程序员,所以像这样的模板可能比赋予它们整个编程语言的全部功能更好。

话虽如此,为了完整起见,让原始代码正常工作的方法是eval,从那时起,与do / require相反,执行代码将能够看到词汇$from$to。与往常一样,这伴随着警告,在用户提供的输入上运行此操作可能危险,因为它允许执行任意代码。这会产生您的预期输出:

use warnings;
use strict;

my $templ = do { open my $fh, '<', 'file.conf' or die $!; local $/; <$fh> };

my $from = '2017-01-01';
my $to   = '2017-04-12';
our $period;

eval "$templ; 1" or die $@;

print $period, "\n";