在Perl中,如何在print语句中使用plus运算符进行算术计算?

Gig*_*han 3 perl

我有以下小型Perl(v5.10)程序:

use strict;

my @nums;
my $i = 0;

while ($i < 5) {

    print "Enter number " . $i+1 . ": ";
    $nums[$i] = <STDIN>;
    $i++;
}

foreach (@nums) {

    chomp $_;
    print "$_\t";
}
print "\n";
Run Code Online (Sandbox Code Playgroud)

这是测试运行的结果:

1: 2
1: 1
1: 6
1: 3
1: 2
2   1   6   3   2   
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,问题是提示用户输入的print语句无法按预期运行.而不是"输入数字1:"或"输入数字3:"等,我得到"1:".我没想到这是诚实的,因为我知道在Perl中字符串连接已经重载了+运算符.我该如何解决这个问题?它的原因是什么?

cho*_*oba 8

+没有超载.这是一个优先问题.表达式被解析为

print(((('Enter number ' . $i) + 1) . ': '));
Run Code Online (Sandbox Code Playgroud)

哪个是一样的

print((0 + 1) . ': ');
Run Code Online (Sandbox Code Playgroud)

您可以使用

perl -MO=Deparse,-p -e 'print "Enter number " . $i+1 . ": ";'
Run Code Online (Sandbox Code Playgroud)

了解Perl如何解析脚本.

添加括号可以解决问题.


rai*_*7ow 5

虽然您的直接问题是对运算符优先级的错误假设,但我还看到了另外两个(潜在的)问题,这些问题也可能很有意思.

首先,使用$i + 1时没什么意义,当你可以从1开始输出'输出'时,以5结尾,但是push用来填充数组.

其次,chomp在脚本的输出阶段看到它有点奇怪,实际上它应该在输入阶段完成(当你试图从用户收集数字时,不是吗?)

例如:

use warnings; use strict;

my @numbers;
for my $i (1..5) {
  print "Enter number $i: ";
  chomp(my $number = <STDIN>);
  push @numbers, $number;
}

print "$_\t" for @numbers;
print "\n";
Run Code Online (Sandbox Code Playgroud)