1

如果字符串中的变量是简单的标量,例如使用正则表达式的“$foo = 5”,我已经找到了执行此操作的方法。但问题是,如果字符串中的变量是:$foo->{bar},它等于 5。

所以示例字符串是:

“这是一个哈希值为 $foo->{bar} 的字符串”。

我怎样才能将其扩展为:

“这是一个哈希值为 5 的字符串”

谢谢。

编辑以获取更多解释:

我有一个字符串文字(我相信?我不是最擅长这个词汇的),它是我从某个文本源收到的“Lorem Ipsum $foo->{bar} Lorem Ipsum”。我想取那个字符串,用我的代码中变量的实际值替换所有变量名。

4

2 回答 2

4

您在那里拥有的东西称为“模板”。因此,您正在寻找一个模板系统。

假设这些引号实际上不在字符串中,我所知道的唯一能够理解模板语言的模板系统是String::Interpolate

$ perl -E'
   use String::Interpolate qw( interpolate );
   my $template = q!This is a string with hash value of $foo->{bar}!;
   local our $foo = { bar => 123 };
   say interpolate($template);
'
This is a string with hash value of 123

如果引号是字符串的一部分,那么您所拥有的是 Perl 代码。因此,您可以通过执行字符串来获得所需的内容。这可以使用eval EXPR.

$ perl -E'
   my $template = q!"This is a string with hash value of $foo->{bar}"!;
   my $foo = { bar => 123 };
   my $result = eval($template);
   die $@ if $@;
   say $result;
'
This is a string with hash value of 123

我强烈建议不要这样做。我也不是特别发现 String::Interpolate 。Template::Toolkit可能是模板系统的流行选择。

$ perl -e'
   use Template qw( );
   my $template = q!This is a string with hash value of [% foo.bar %]!."\n";
   my %vars = ( foo => { bar => 123 } );
   Template->new()->process(\$template, \%vars);
'
This is a string with hash value of 123
于 2012-10-05T18:36:55.640 回答
-2

这应该有效:

$foo->{"bar"} = 5;
printf "This is a string with hash value of $foo->{\"bar\"}]";
于 2012-10-05T18:27:27.640 回答