如何在字符串中替换非简单变量引用

时间:2019-10-25 14:05:30

标签: perl

考虑以下代码:

my $msg='My name is $person->{name}.';
my $person={ name=>'Peter', gender=>'Male' };

所以我想打印$ msg。我看过解决简单的变量替换(例如“ $ name”)的示例,但是我还没有看到如何解决问题的方法。我尝试过:

print eval $msg;

但这不起作用(不打印任何内容)。如何打印My name is Peter.

4 个答案:

答案 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常见问题解答以获取诸如此类问题的答案。

How can I expand variables in text strings?