Как подставить непростые переменные ссылки в строку - PullRequest
0 голосов
/ 25 октября 2019

Рассмотрим следующий код:

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

Итак, я хочу напечатать $ msg. Я видел примеры, которые разрешают простые замены переменных, такие как «$ name», но я не видел, как решить мою проблему. Я попытался:

print eval $msg;

, но это не сработало (ничего не печатал). Как я могу напечатать My name is Peter.?

Ответы [ 4 ]

4 голосов
/ 25 октября 2019

Вы изобретаете систему шаблонов. К счастью, он уже существует: Шаблон .

#!/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 голос
/ 25 октября 2019

Когда 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"/;
1 голос
/ 25 октября 2019

Работает, когда вы сначала объявляете хеш. Обязательно используйте двойные кавычки:

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

print $msg;
0 голосов
/ 25 октября 2019

Всегда стоит проверить FAQ Perl для ответов на подобные вопросы.

Как я могу расширить переменные в текстовых строках?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...