(我最近决定使用O'Reilly Learning Perl 第6版学习Perl。)
目标:列出另一个列表中的数字列表,其中只包含大于源数组平均值的数字。但是,
这是由本书提供的。
my @fred = above_average(1..10);
print "\@fred is @fred\n";
print "(Should be 6 7 8 9 10)\n";
my @barney = above_average(100, 1..10);
print "\@barney is @barney\n";
print "(Should be just 100)\n";
这是我的回复。
sub total {
#computes total of array
}
sub average {
#computers average from
#array and length of said array
}
sub above_average {
$average = average(@_);
my @ab_avr;
foreach $num (@_) {
if ($num > $average) {
push @ab_avr, $num;
}
}
@ab_avr;
}
第一个样本似乎正在工作,但是第二个样本输出100,这是正确的,但我不明白为什么要返回100个。我传入above_average()
的数组只有1到10的数字,附加参数为100.调整默认变量$ _,从不使用,为什么显示100?
感谢。
答案 0 :(得分:2)
Lists and arrays are subtly different。您不能将数组传递给子例程;所有子程序都采用列表和返回列表;传递的整个列表在子例程中可用,就好像它是数组@_
。
在这种情况下,您传递100, 1..10
,因此@_
实际上将包含100,1,2,3,...,10。
这在您的代码中实际上不是问题,但您应该尽可能地尝试使用词法,例如: my $average =
,foreach my $num
,并使用严格和警告。