我正在尝试编写一个简单的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;
}
答案 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 '');