2013-01-25 62 views
0

我正在嘗試編寫一個簡單的perl腳本來學習Perl。這是我用用戶輸入編寫的第一個腳本,它對我來說很簡單:P腳本需要獲得用戶輸入的一系列數字並找到它們的平均值。我想使用'文件結束'這一行來顯示用戶已經完成輸入代碼。任何幫助,將不勝感激。以下是我到目前爲止。我想我非常接近,但我錯過了一些東西。Perl程序來計算用戶輸入的數字的總和

代碼:

#! /usr/bin/perl 
use 5.010; 


print "Enter the scores and type end-of-file when done"; 
chomp(@scores = <STDIN>); 
foreach (@scores) { 
    push_average(total(@scores)); 
} 




sub total { 
    my $sum; 
    foreach (@_) { 
     $sum += $_; 
    } 
    sum; 
} 

sub average { 
    if (@_ == 0) {return} 
    my $count = @_; 
    my $sum = total(@_); 
    $sum/$count; 
} 

sub push_average { 
    my $average = average(@_); 
    my @list; 
    push @list, $average; 
    return @list; 
} 

回答

3

你是相當接近。在每個Perl腳本的頂部添加use strict; use warnings會提醒您其他可能不被注意的錯誤。

一些提示:

  • 你忘了的$sum的印記在total的最後一條語句。目前,你返回一個字符串「sum」(沒有嚴格的變數),或者可能調用一個名爲sum的子。

  • 你不需要foreach中的主要部分,而做

    my @averages = push_average(@scores); 
    

    total已經內部push_average

  • 你可能想打印出結果得到的平均值計算:

    my $avg = $averages[0]; 
    say "The average of these numbers is $avg"; 
    
  • push_average很愚蠢;你返回一個新元素的數組。你也可以返回一個元素。


建議腳本:

use strict; use warnings; use 5.010; 
use List::Util qw/sum/; # very useful module 

# say is like print, but appends a newline. Available with 5.10+ 
say "Please enter your numbers, finish with Ctrl+D"; 
my @nums = <STDIN>; 
chomp @nums; 

# The // is the defined-or operator 
# interpolating undef into a string causes a warning. 
# Instead, we give an expressive message: 
my $avg = average(@nums) // "undefined"; 

say "The average was $avg"; 

sub average { @_ ? sum(@_)/@_ : undef } # return undef value if called without args 
+0

WOW。這比我想要做的要簡單得多......如果它試圖用0除以,你將如何處理? – JLott

+1

剛剛添加了處理該代碼的代碼:如果參數數組「@ _」爲空,則返回「undef」 - 這是有意義的,因爲沒有定義0÷0。我測試了定義的子的返回值,可能會打印出'undefined'字符串。這使得一個不錯的用戶界面。 – amon

+0

好的。真棒!它似乎在工作。非常感謝你的幫助。 – JLott

0

讀取到換行符。你在這裏有幾個選擇。您可以要求用戶輸入以空格分隔的數字,然後將其分成您的@choices數組。或者你可以不斷要求他們輸入一個數字,或者直接按回車鍵結束。

答案1)

print "Enter scores separated by a space and press enter when done"; 
chomp($input = <STDIN>); 
@choices = split(' ', $input); 

答案2)

@chomp =(); 
do { 
    print "Enter a score and then press enter. If done, just press enter."; 
    chomp($temp = <STDIN>); 
    if($trim ne '') { 
    push(@choices, $temp); 
    } 
} until ($temp eq ''); 
相關問題