免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2548 | 回复: 9
打印 上一主题 下一主题

关于子例程的返回值 [复制链接]

论坛徽章:
1
辰龙
日期:2014-01-02 13:34:19
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-26 16:06 |只看该作者 |倒序浏览
我是一个perl新手,正在看《perl语言入门》(learning perl)的第四章 ---子例程。
书上67页说:“在子例程的执行过程中,它会不断的进行运算。其中,最后一次运算的结果不管是多少,都会被自动当成子例程的返回值。”
然后看到72的例子:
#!/usr/bin/perl -w

$maximum = &max(3,5,10,4,6);
sub max{
        my($max_so_far) = shift @_;
        foreach (@_){
                if($_ > $max_so_far){
                        $max_so_far = $_;
                }
        }
        $max_so_far;
}
print $maximum,"\n";


我想能不能把max子例程最后的"$max_so_far;"去掉,反正最后执行的表达式为:
  1. $max_so_far = $_;
复制代码
但是去掉后,输出是空,并不是想象中的最大值10。
#!/usr/bin/perl -w

$maximum = &max(3,5,10,4,6);
sub max{
        my($max_so_far) = shift @_;
        foreach (@_){
                if($_ > $max_so_far){
                        $max_so_far = $_;
                }
        }
#       $max_so_far;

}
print $maximum,"\n";

论坛徽章:
0
2 [报告]
发表于 2008-04-26 16:23 |只看该作者
你还能自己分析下程序看最后一次执行是不是   $max_so_far = $_;

论坛徽章:
1
辰龙
日期:2014-01-02 13:34:19
3 [报告]
发表于 2008-04-26 16:48 |只看该作者
redicaps,
你的意思是:最后由于“6” 小于“10”,没有执行 $max_so_far = $_; 。 对吗?
那我把程序改为:
#!/usr/bin/perl -w


$maximum = &max(3,5,10,4,6,17);
sub max{
        my($max_so_far) = shift @_;
        foreach (@_{
                if($_ > $max_so_far){
                        $max_so_far = $_;
                }
        }
#        $max_so_far;

}
print $maximum,"\n";



最后应该执行  $max_so_far = $_; 了吧。
但是输出依然是空值。

还是,这个sub子例程最后一次的运算为
  1. foreach (@_)
复制代码

所以返回空。

论坛徽章:
1
辰龙
日期:2014-01-02 13:34:19
4 [报告]
发表于 2008-04-26 17:37 |只看该作者
又做了一个测试,感觉问题出在:max子例程最后执行的一次运算为
foreach (@_);
而不是我原来理解的
$max_so_far = $_;

不知道,我的理解是否正确。请大家帮看看。

论坛徽章:
0
5 [报告]
发表于 2008-04-26 19:20 |只看该作者
你最后的理解是对的

论坛徽章:
0
6 [报告]
发表于 2008-04-26 19:36 |只看该作者

回复 #1 acheng170 的帖子

兄弟太爱专研了,努力

论坛徽章:
0
7 [报告]
发表于 2008-04-27 15:57 |只看该作者

回复 #4 acheng170 的帖子

佩服

论坛徽章:
0
8 [报告]
发表于 2012-07-27 13:08 |只看该作者
兄弟我刚刚也为这个问题发愁中。参看下。

论坛徽章:
0
9 [报告]
发表于 2012-07-28 10:18 |只看该作者
本帖最后由 laputa1973 于 2012-07-28 10:20 编辑

没注意,挖坟贴。

论坛徽章:
0
10 [报告]
发表于 2012-07-29 23:00 |只看该作者
想当然了,没好好看文档
If no return is found and if the last statement is an expression, its value is returned. If the last statement is a loop control structure like a foreach or a while , the returned value is unspecified. The empty sub returns the empty list.

说的很清楚了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP