Perl程序,用于计算用户输入的数字总和

时间:2013-01-25 04:24:39

标签: perl input average

我正在尝试编写一个简单的perl脚本来学习Perl。这是我使用用户输入编写的第一个脚本,只有我这样:P脚本需要获取用户输入的一系列数字并找到它们的平均值。我想使用'end-of-file'来表明用户输入了代码。任何帮助,将不胜感激。以下是我到目前为止的情况。我想我很亲密,但我错过了一些东西。

代码:

#! /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;
}

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

读取换行符。你在这里有一些选择。您可以要求用户输入以空格分隔的数字,然后将其拆分为@choices数组。或者您可以继续要求他们输入数字或只需按Enter键即可完成。

答案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 '');