我有以下小型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
正如您所看到的,问题是提示用户输入的print语句未按预期运行。而不是“输入数字1:”或“输入数字3:”,e.t.c。,我得到“1:”。我没想到这是诚实的,因为我知道在Perl中字符串连接已经重载了+运算符。我该如何解决这个问题?这是什么原因?
答案 0 :(得分:8)
+
未超载。这是一个优先问题。表达式被解析为
print(((('Enter number ' . $i) + 1) . ': '));
与
相同print((0 + 1) . ': ');
您可以使用
perl -MO=Deparse,-p -e 'print "Enter number " . $i+1 . ": ";'
了解Perl如何解析脚本。
添加括号可以解决问题。
答案 1 :(得分: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";