小骆驼书4-3习题讲解的疑问

小骆驼书4-3习题讲解的疑问

大家好,小骆驼书的习题4-3:
写一个子例程,用来传入一串数字,并返回所有大于平均值的数字。

sub total {
    my $total = 0;
    foreach (@_) {
        $total += $_;
    }
    $total;
}

sub average {
    if (@_ == 0) { return;
    }
    my $count = @_;
    my $sum = &total(@_);
    $sum/$count;
}

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

    foreach $element (@_) {
        if ($element > $average) {
            push @list, $element;
        }
    }
    @list;
}

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";

以上是问题的答案,但是书后讲解部分我有些疑问:
讲解原文:
子例程above_average会建立并返回所需项目所构成的列表(为何循环的控制变量是$element,而不是Perl最喜爱的默认变量$_?)请注意,这个子例程对于空参数列表有不同的处理方式。

我的问题:
1. 括号中提出的问题,为什么不使用默认变量$_。我在自己做这道题的答案的时候就使用的$_,结果也出来了,没有发现什么地方不妥。
2. 最后一句话,“这个子例程对于空参数列表有不同的处理方式”,我就不明白作者想要向读者隐含表达什么意思。

请各位指教,多谢!
你中午吃的什么?
什么?你居然吃的米饭?
为什么不吃我最爱吃的面条?
我试过,吃面条也是可以的呀。
for (@ary)
也可以用
for my $element (@ary)

只是把$_改成$element..
因为用$_可能会造成混淆..尤其是有两重回圈的时候...


QUOTE:
原帖由 flw 于 2008-3-26 12:25 发表
你中午吃的什么?
什么?你居然吃的米饭?
为什么不吃我最爱吃的面条?
我试过,吃面条也是可以的呀。

orz2death
精辟啊
版版可以出本书
题目就叫"日常生活中的perl哲学"


QUOTE:
原帖由 churchmice 于 2008-3-26 12:38 发表

orz2death
精辟啊
版版可以出本书
题目就叫"日常生活中的perl哲学"

这和 Perl 无关。
很多人搞计算机时碰到各种各样的问题,
大多都是因为钻牛角尖了——这时候不妨放松一下,别那么较真。
第二个问题我应该结合前文来理解
上文讲过一种不返回undef的方法
就是
my $sum =0;
而在这里直接返回@list是没有问题的,在scalar环境中返回0,在list环境中返回 0,
我想这就是所谓的不同方式
还有中文翻的有一点点问题
英文原话是

QUOTE:
Note that this second sub uses a different technique for dealing with an empty parameter list.

这话的意思是处理empty parameter list的方法有很多种,而sub above_average的处理方式和上文所说的方式不一样
谢谢大家!
1. 好像作者在某个地方说过$_如果过分使用,很有可能导致混乱,所以我在怀疑这里面是不是也不会导致混乱。呵呵。看来经过flw老大分析,还是没有问题的。呵呵。

2. 谢谢 churchmice 把原文copy出来,确实中文版的翻译造成了误解。并且谢谢你详细的讲解。


QUOTE:
原帖由 flw 于 2008-3-26 12:45 发表

这和 Perl 无关。
很多人搞计算机时碰到各种各样的问题,
大多都是因为钻牛角尖了——这时候不妨放松一下,别那么较真。

恩。对滴。总是沉迷于自己的思维逻辑中,不可自拔。
foreach隐含的局部化任何变量,与while循环不同