3

我有以下小型 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";

这是测试运行的结果:

1: 2
1: 1
1: 6
1: 3
1: 2
2   1   6   3   2   

如您所见,问题在于提示用户输入的打印语句没有按预期运行。而不是“输入数字 1:”或“输入数字 3:”等,我只得到“1:”。老实说,我没想到这会起作用,因为我知道 + 运算符已被重载以用于 Perl 中的字符串连接。我该如何解决这个问题?原因是什么?

4

2 回答 2

8

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

print(((('Enter number ' . $i) + 1) . ': '));

这与

print((0 + 1) . ': ');

您可以使用

perl -MO=Deparse,-p -e 'print "Enter number " . $i+1 . ": ";'

看看 Perl 如何解析你的脚本。

添加括号可以解决问题。

于 2012-10-06T23:35:32.557 回答
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";
于 2012-10-06T23:35:36.223 回答