考虑以下代码:
my $msg='My name is $person->{name}.';
my $person={ name=>'Peter', gender=>'Male' };
所以我想打印$ msg。我看过解决简单的变量替换(例如“ $ name”)的示例,但是我还没有看到如何解决问题的方法。我尝试过:
print eval $msg;
但这不起作用(不打印任何内容)。如何打印My name is Peter.
?
答案 0 :(得分:4)
您正在发明一个模板系统。幸运的是,它已经存在:Template。
#!/usr/bin/perl
use warnings;
use strict;
use Template;
my $msg='My name is [% person.name %].';
my $person={ name=>'Peter', gender=>'Male' };
my $template = 'Template'->new;
$template->process( \$msg, { person => $person }, \ my $output );
print $output;
答案 1 :(得分:1)
它在您首先声明哈希时有效。 确保使用双引号:
my $person={ name=>'Peter', gender=>'Male' };
my $msg="My name is $person->{name}.";
print $msg;
答案 2 :(得分:1)
当eval
“不起作用”时,它将设置特殊变量$@
,并在计算表达式时遇到Perl遇到的错误。就您而言,该消息是
syntax error at (eval 1) line 2, at EOF
因为文字是
My name is $person->{name}.
不能被解析为Perl代码。但是一个简单的解决方法是将该文本用引号引起来。
my $msg='"My name is $person->{name}."';
my $person={ name=>'Peter', gender=>'Male' };
print eval $msg;
输出:
My name is Peter.
修复此程序的其他方法是将引号引起的文本发送到eval
:
my $msg='My name is $person->{name}.';
print eval "\"$msg\"";
print eval qq/"$msg"/;
答案 3 :(得分:0)
始终值得检查Perl常见问题解答以获取诸如此类问题的答案。