2012-10-06 27 views
3

我有以下的小的Perl(V5.10)程序:在Perl中,如何在print語句中使用plus運算符進行算術計算?

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:」,e.t.c.,我只是得到「1:」。我沒有想到這是誠實的,因爲我知道+運算符已經在Perl中用於字符串連接。我如何解決這個問題?這是什麼原因?

回答

8

+未被重載。這是一個優先問題。該表達式解析爲

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

這是一樣的

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

您可以使用

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

看到的Perl如何分析你的腳本。

添加括號可解決問題。

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