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

Lan*_*ane 1 perl string-interpolation

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

Perl中有没有相同的东西?

zdi*_*dim 11

使用perlref中的引用

在您将标识符(或标识符链)作为变量或子例程名称的一部分放置的任何地方,您可以使用包含正确类型的引用的简单标量变量替换标识符
...
您将放置标识符的任何位置(或标识符链)作为变量或子例程名称的一部分,您可以用BLOCK替换标识符,返回正确类型的引用.

所以

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

你可以在哪里运行代码返回一个标量里面的\(...)内容,然后${...}取消引用它.类似地,您可以生成一个arrayref并使用@{...}

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

并且类似于哈希.但是这也是一个返回标量的表达式

perl -wE'say "$_ squared: @{[ $_**2 ]}" for 1..10'
Run Code Online (Sandbox Code Playgroud)

这更好,更"常用".感谢ysth发表评论.

请记住,[ ]强加列表上下文,其中返回通常与标量上下文中的不同(并且\(LIST)在其他帐户上是错误的).一个很好的例子是本地时间.标量返回可以通过执行[scalar localtime].感谢ikegami的评论.

请注意,您不会被拖入使用符号引用.另见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');
Run Code Online (Sandbox Code Playgroud)

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

该主题在perlfaq4和本文perlref顶部链接部分的末尾进行了讨论.


\(LIST)参考中列出了每个元素,perl -wE'say for \(1,2)'.然后标量上下文中的逗号运算符执行其操作,一个接一个地丢弃左侧操作数并${ \(LIST) }最终提供列表的最后一个元素.

  • 人们更常使用"结果:@ {[$ x + $ y]}"`,这更漂亮.或者更常见的是使用临时变量.sprintf也有其拥护者和地位. (3认同)