我不知道如何命名我想做什么,我知道它很奇怪。
我有一个脚本和这个脚本的外部配置文件。我希望用户能够以可访问的形式选择变量本身。它就像模板一样。
#!/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;
$period = "$from \- $to";
1;
2017-01-01 - 2017-04-12
同样的输出应该在file.txt中。这个解决方案不起作用,定义$ period有未定义的变量$ from和$ to。我想在不同的代码行中使用这一行。
这样的输出是否可能?我强调,这个想法是为那些不知道子程序,哈希甚至数组是什么的用户提供最美观和最简单的解决方案。
答案 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";