2014-05-18 60 views
0

我試圖打印數字列表的總和,最大值和最小值,但我努力讓它工作。當輸入空行時,Perl while循環不會退出

當我按下Enter鍵循環應該退出,但是程序繼續運行

use strict; 
use warnings; 

my @items; 
my ($sum, $max, $min); 

while (chomp(my $num = <STDIN>)) { 
    last if ($num eq '\n'); 

    $max ||= $num; 
    $min ||= $num; 
    $sum += $num; 

    $max = $num if ($num > $max); 
    $min = $num if ($num < $min); 

    push(@items, $num); 
} 

printf("Entered numbers are: %s \n", join(', ', @items)); 
print("Sum of all numbers is : ", $sum); 
print "\n"; 
print("Minimum number is : ", $min); 
print "\n"; 
print("Maximum number is : ", $max) 
+0

這與[link](http://stackoverflow.com/questions/23707595/error-in-finding-minimum-element-in-perl)是一樣的問題嗎? – Glenn

+0

是@borodin告訴我將它作爲另一個問題提問 – Dinesh

+0

@Glenn:程序類似,但前一個問題的問題是最小值未打印。這一次循環沒有退出 – Borodin

回答

2
  • 因爲while循環需要終止您不能使用chomp一個while條件內像這樣

    while (chomp(my $num = <STDIN>)) { ... } 
    

    時在文件末尾的<>回報undef。所以,你必須把chomp作爲循環

  • 的第一個語句的最簡單方式退出循環像這樣的檢查輸入是否包含使用正則表達式/\S/

  • 的任何非空格字符檢查

    last if ($num eq '\n') 
    

    將不起作用,因爲您已使用chomp從輸入中刪除換行符。此外,如果您使用單引號'\n'是兩個字符的字符串\,然後是n。你需要雙引號像"\n"創建一個新行

  • 當一個標量首次宣佈它的值爲undef,這樣你就可以通過測試這一點,並更新$min$max除非以前的值已經是避免任何笨拙的初始化並且比新值更高(或更低)

我會像這樣重寫你的程序。

use strict; 
use warnings; 

my @items; 
my ($sum, $max, $min); 

while (my $num = <STDIN>) { 
    chomp $num; 
    last unless $num =~ /\S/; 

    $max = $num unless defined $max and $max >= $num; 
    $min = $num unless defined $min and $min <= $num; 
    $sum += $num; 
    push @items, $num; 
} 

print 'Entered numbers are: ', join(', ', @items), "\n"; 
print "Sum of all numbers is: $sum\n"; 
print "Minimum number is: $min\n"; 
print "Maximum number is: $max\n"; 
+0

我敢肯定,有些地方''除了''是首選,但它的用處只是讓我癢。以下內容對我來說更符合邏輯:'$ max = $ num if!定義$ max || $ num> $ max;' – Miller

2

如果你想檢測輸入,你不能chomp輸入之前。另外,'\n'不是輸入,您必須使用雙引號"\n"來啓用特殊字符。

while (<>)循環通常以結束Ctrl + D

此外,您可以找到一個模塊爲您完成工作。

#!/usr/bin/perl 
use warnings; 
use strict; 

use List::Util qw{ max min sum }; 

my @items = <>; 
chomp @items; 
my $max = max(@items); 
my $min = min(@items); 
my $sum = sum(@items); 

print "Entered numbers are: @items\n"; 
print "Sum of all numbers is: $sum\n"; 
print "Minimum number is: $min\n"; 
print "Maximum number is: $max"; 
+0

我相信OP在編寫這個程序時的意圖是練習基本的Perl,所以使用'List :: Util'就會失敗。然而無限循環問題的解決方案是現成的。 +1 – Borodin