免费注册 查看新帖 |

Chinaunix

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

【再次求解】一个几天前让我出bug的函数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-13 15:24 |只看该作者 |倒序浏览
这里我就只写一个原型
use warnings;
use strict;
use Data:umper;
use Time::HiRes;

sub foo {
    for my $i ( 1..5 ) {
        my $bar = 2 if $i == 2;
        
        if ( !defined($bar) ) {
            $bar = 4 if $i % 2;
        }
        
        print $bar || '', "\n";
    }
}

foo();

这个输出应该是什么呢:
4
2
4
4
4
还是
4
2
4

4
为什么?

论坛徽章:
0
2 [报告]
发表于 2010-11-13 15:26 |只看该作者
如果这样写
sub foo {
    for my $i ( 1..5 ) {
        my $bar;
        $bar = 2 if $i == 2;
        
        if ( !defined($bar) ) {
            $bar = 4 if $i % 2;
        }
        
        print $bar || '', "\n";
    }
}

foo();

输出肯定是比较明确的

论坛徽章:
0
3 [报告]
发表于 2010-11-13 16:14 |只看该作者
一楼的程序,肯定有问题,在$bar没有定义的情况下,用!defined($bar)判断,容易出错很正常,是你自己的逻辑错误,程序结果并没错。

在$i为1时,你将全局变量(因为你事先并没有声明这个变量)$bar的值变成了4,$1为2时,my $bar生效,变为2,虽然名称相同,但它只是在FOR内的局部变量,并没有覆盖全局变量,所以$1为3,4,5时,print $bar 的输出都是全局变量$bar的值。

论坛徽章:
0
4 [报告]
发表于 2010-11-13 16:19 |只看该作者
但是我用了use strict,没有声明的全局变量是允许的吗?
如果这样允许的话,那说明use strict还是有缺陷的

论坛徽章:
0
5 [报告]
发表于 2010-11-13 16:28 |只看该作者
use strict并非万能,my $bar = 2 if $i == 2这里可能让它误认为声明了吧,养成好习惯,出错的概率就会降低很多。

水平有限,说不出所以然,请楼下的高手解释。

论坛徽章:
0
6 [报告]
发表于 2010-11-13 16:33 |只看该作者
我也是觉得my $bar = 2 if $i == 2对use strict使了障眼法。
这个bug我曾经头疼了很久,后来终于查出来了,呵呵。

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
7 [报告]
发表于 2010-11-13 19:25 |只看该作者
本帖最后由 zhlong8 于 2010-11-13 20:17 编辑

很简单,这样用根本就是错的,文档说的很清楚。ActivePerl 自带的 perlcritic 可以检查这种错误,而 strict 查检末声明变量是在编译期进行的。

perlsyn
NOTE: The behaviour of a my statement modified with a statement modifier conditional or loop construct (e.g. my $x if ... ) is undefined. The value of the my variable may be undef, any previously assigned value, or possibly anything else. Don't rely on it. Future versions of perl might do something different from the version of perl you try it out on. Here be dragons.

论坛徽章:
0
8 [报告]
发表于 2010-11-15 14:35 |只看该作者
看说明是说perl也还没定对于这个写法该怎么处理。
所以其实应该归于perl的一个缺陷,他应该明确该怎么处理,如果确定不那么处理,就告诉我那样写是错的。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2010-11-15 14:52 |只看该作者
看说明是说perl也还没定对于这个写法该怎么处理。
所以其实应该归于perl的一个缺陷,他应该明确该怎么处理 ...
yiten 发表于 2010-11-15 14:35

未定义行为这个术语很常见吧。

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
10 [报告]
发表于 2010-11-15 15:02 |只看该作者
看说明是说perl也还没定对于这个写法该怎么处理。
所以其实应该归于perl的一个缺陷,他应该明确该怎么处理 ...
yiten 发表于 2010-11-15 14:35


如果你要的是解释...楼上的几位都指出来了......
由其最后一句: "Here be dragons"


如果你要解决真正的问题.....

There's more than one way to do it

重述你(真正)的问题? (你要的功能或结果)

我们可以找更好,更不会出错的方法......
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP