0

我的脚本需要获取用户输入的一系列数字并找到它们的平均值。我想使用“文件结尾”这一行来表明用户已完成输入代码。任何帮助,将不胜感激。以下是我到目前为止所拥有的。我想我真的很接近,但我错过了一些东西。

代码:

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

2 回答 2

3

你很接近。在每个 Perl 脚本的顶部添加use strict; use warnings会提醒您可能不会注意到的错误。

一些提示:

  • 您忘记$sumtotal. 目前,您返回一个字符串“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
于 2013-01-25T04:38:21.863 回答
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 '');
于 2013-01-25T04:32:10.550 回答