在Perl中,有没有办法在引号内做简单的算术运算?

Lea*_*ing 4 perl

$i = 5;
print "{$i*10}";
Run Code Online (Sandbox Code Playgroud)

有时我可能需要做上面这样的事情,但是Perl没有按照我想要的方式解释它,而且我只能用另一个变量来做.有一个技巧吗?

Nod*_*ody 11

我建议你使用"printf":

printf("%s",$i*10);
Run Code Online (Sandbox Code Playgroud)

那就行了.

  • 有了所有其他选项,这个选项在99.999%的时间是正确的. (4认同)

yst*_*sth 11

$i = 5;
print "${\($i*10)}";
Run Code Online (Sandbox Code Playgroud)

要么

print "@{[$i*10]}";
Run Code Online (Sandbox Code Playgroud)

这些内插一个"变量",它是代码块的解引用,包含适当类型的引用(第一个实例中的标量,第二个实例中的数组).

另一种方法是使用一个虚拟散列,始终将键作为值返回:

use strict;
use warnings;

{
    package Tie::Hash::Dummy;
    use Tie::Hash;
    use parent -norequire => 'Tie::StdHash';
    sub FETCH { $_[1] }
    tie our %Lookup, __PACKAGE__;
}

my $i = 5;
print "$Tie::Hash::Dummy::Lookup{$i*10}";
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用\N{}字符名称查找接口,虽然这将绑定来自不同位置的变量,并且在编译时(以及使用字符串eval,可能是安全问题):

my $i;
BEGIN { $i = 5 }
BEGIN { $^H{'charnames'} = sub { eval $_[0] } }
print "\N{$i*10}";
Run Code Online (Sandbox Code Playgroud)

(如果charnames处理程序返回一个在字符串化时执行eval的重载代理对象,这可能会更好,但我没有时间尝试它.)

另一种方法是使用overload :: constant()设置字符串常量处理程序.

  • 是,我确定.perl中的()永远不会创建列表或内容数组,它只会影响优先级.也就是说,\\()有点特别之处在于它返回一个对()中包含的元素的引用列表,但在你的情况下只有一个. (3认同)
  • 括号中唯一做的是导致优先级较低,首先发生.没有它们,`@ arr = 1,2,3`变为`(@arr = 1),2,3`.()不创建列表. (3认同)