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

问题描述 投票:0回答:4

请考虑以下代码:

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

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

print eval $msg;

但是那不起作用(什么都不打印)。如何打印My name is Peter.

perl
4个回答
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"/;

2
投票

您正在发明一个模板系统。幸运的是,它已经存在: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
投票

它在您首先声明哈希时有效。确保使用双引号:

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

print $msg;

0
投票

总是值得在Perl FAQ中查看有关此类问题的答案。

How can I expand variables in text strings?

© www.soinside.com 2019 - 2024. All rights reserved.