如何在字符串中 运行 编码(相当于 Ruby 的 #{})
How to run code inside a string (equivalent to Ruby's #{})
我知道我们可以把#{}
中的任何代码放在Ruby中,#{}
中的代码将被计算然后插入到一个字符串中。
Perl 中是否有任何等效的东西?
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()}.};
我知道我们可以把#{}
中的任何代码放在Ruby中,#{}
中的代码将被计算然后插入到一个字符串中。
Perl 中是否有任何等效的东西?
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()}.};