Perl:子例程输出显示之前需要

时间:2014-03-27 07:11:01

标签: linux perl

我对perl完全不熟悉,现在我真的陷入了这个问题(可能非常简单)。问题本身就是简单的输出问题,我得到的结果应该是它们之前。这是我写的代码:

sub above_average
{
        my $average = &average(@_);

        foreach my $thing (@_)
        {
                if ($thing > $average)
                {
                        print $thing;
                }
        }

}

my @fred = &above_average(1..10);

print "\@fred is @fred\n";
print "(Should be 6 7 8 9 10)\n";

我运行代码时得到的结果是:

678910@fred is 
(Should be 6 7 8 9 10)

它应该看起来像@fred is 6 7 8 9 10而不是678910@fred is。我只是不知道如何解决它,我已经好几个小时已经没有运气了。

1 个答案:

答案 0 :(得分:6)

您的子程序print是那些大于平均值的数字,它不是return它们。但请注意,您只能从子程序返回一次,因此我们首先必须收集所有较大的值:

sub above_average {
    my $avg = average(@_);
    return grep { $_ > $avg } @_;
}

这是表达

的简短方法
sub above_average {
    my $avg = average(@_);
    my @out;
    for my $num (@_) {
        push @out, $num if $num > $avg;
    }
    return @out;
}

提示:不要使用前导&调用子程序,这是一种不必要的古老习惯,并且有一些你可能不知道的效果。如果可能,请避免使用它。