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

时间:2011-07-05 06:33:40

标签: perl

$i = 5;
print "{$i*10}";

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

5 个答案:

答案 0 :(得分:11)

我建议你使用“printf”:

printf("%s",$i*10);

那就行了。

答案 1 :(得分:11)

$i = 5;
print "${\($i*10)}";

print "@{[$i*10]}";

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

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

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}";

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

my $i;
BEGIN { $i = 5 }
BEGIN { $^H{'charnames'} = sub { eval $_[0] } }
print "\N{$i*10}";

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

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

答案 2 :(得分:2)

$i = 5;
print "${\($i*10)}";

不是我建议那样做的!

更新:它(或多或少)等同于:

$i = 5;
$j = ($i * 10);
$k = \$j;
print "${$k}";

答案 3 :(得分:1)

您可以尝试以下方法,

print "{". $i*10. "}";

答案 4 :(得分:1)

您是否尝试访问哈希?

如果没有,那么只需使用:print“{”。($ i * 10)“}”;