请考虑以下代码:
my $msg='My name is $person->{name}.';
my $person={ name=>'Peter', gender=>'Male' };
所以我想打印$ msg。我看过解决简单的变量替换(例如“ $ name”)的示例,但是我还没有看到如何解决问题的方法。我尝试过:
print eval $msg;
但是那不起作用(什么都不打印)。如何打印My name is Peter.
?
[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"/;
您正在发明一个模板系统。幸运的是,它已经存在: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;
它在您首先声明哈希时有效。确保使用双引号:
my $person={ name=>'Peter', gender=>'Male' };
my $msg="My name is $person->{name}.";
print $msg;
总是值得在Perl FAQ中查看有关此类问题的答案。