如何在字符串中 运行 编码(相当于 Ruby 的 #{})

How to run code inside a string (equivalent to Ruby's #{})

我知道我们可以把#{}中的任何代码放在Ruby中,#{}中的代码将被计算然后插入到一个字符串中。

Perl 中是否有任何等效的东西?

来自Using references in perlref

Anywhere you'd put an identifier (or chain of identifiers) as part of a variable or subroutine name, you can replace the identifier with a simple scalar variable containing a reference of the correct type
...
Anywhere you'd put an identifier (or chain of identifiers) as part of a variable or subroutine name, you can replace the identifier with a BLOCK returning a reference of the correct type.

所以

perl -Mstrict -wE'my $x = 2.6; say "Integer part: ${ \( int $x ) }"'

您可以在其中 运行 编码 return 在 \(...) 中获取其引用的标量,然后 ${...} 取消引用它。同样,您可以生成一个 arrayref 并在其周围使用 @{...}

perl -Mstrict -wE'$_ = q(silly,it,is); say "Got: @{ [ /(\w+)/g ] }"'

和散列相似。但是这与表达式 returning 一个标量以及

perl -wE'say "$_ squared: @{[ $_**2 ]}" for 1..10'

哪个更好用"commonly"。感谢 ysth 的评论。

请记住,[ ] 强加了列表 context, where the return often differs from the one in scalar context (and \(LIST) is wrong on other accounts). A good example is localtime. The scalar return can be enforced by [scalar localtime]. Thanks to ikegami 以供评论。

注意不要被拖入使用 symbolic references though. Also see that in perlfaq7

这假设您认为 {...} 中的代码是字符串的一部分。如果你想要一个字符串并将它包含的内容作为代码执行,这就是 eval EXPR 所做的。 但请注意,总有更好的方法来满足您的需求。

几个例子

my $str = sprintf "Squared: %6.3f", $x**2;
my $str = "He said: " . join ' ', split /,/, 'yes,it,is';  #/
say "Variable is: ", ( $x // 'undef');

或使用 do { ... }; 评估限制范围内的任何代码和 return 结果,然后可以将其与其他字符串连接或连接。

讨论了该主题 in perlfaq4 并在 perlref 部分末尾链接到此 post。


\(LIST) 中引用列表的每个元素,perl -wE'say for \(1,2)'。然后标量上下文中的逗号运算符执行它的操作,一个接一个地丢弃左侧操作数,${ \(LIST) } 最终服务于列表的最后一个元素。

如果允许您使用 CPAN,Quote::Code 也可以。

来自剧情简介:

use Quote::Code;
print qc"2 + 2 = {2 + 2}";  # "2 + 2 is 4"
my $msg = qc{The {$obj->name()} is {$obj->state()}.};