【再次求解】一个几天前让我出bug的函数
时间:2010-11-13
来源:互联网
这里我就只写一个原型
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
为什么?
use warnings;
use strict;
use Data:

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
为什么?
作者: yiten 发布时间: 2010-11-13
如果这样写
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();
输出肯定是比较明确的
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();
输出肯定是比较明确的
作者: yiten 发布时间: 2010-11-13
一楼的程序,肯定有问题,在$bar没有定义的情况下,用!defined($bar)判断,容易出错很正常,是你自己的逻辑错误,程序结果并没错。
在$i为1时,你将全局变量(因为你事先并没有声明这个变量)$bar的值变成了4,$1为2时,my $bar生效,变为2,虽然名称相同,但它只是在FOR内的局部变量,并没有覆盖全局变量,所以$1为3,4,5时,print $bar 的输出都是全局变量$bar的值。
在$i为1时,你将全局变量(因为你事先并没有声明这个变量)$bar的值变成了4,$1为2时,my $bar生效,变为2,虽然名称相同,但它只是在FOR内的局部变量,并没有覆盖全局变量,所以$1为3,4,5时,print $bar 的输出都是全局变量$bar的值。
作者: iamlimeng 发布时间: 2010-11-13
但是我用了use strict,没有声明的全局变量是允许的吗?
如果这样允许的话,那说明use strict还是有缺陷的
如果这样允许的话,那说明use strict还是有缺陷的
作者: yiten 发布时间: 2010-11-13
use strict并非万能,my $bar = 2 if $i == 2这里可能让它误认为声明了吧,养成好习惯,出错的概率就会降低很多。
水平有限,说不出所以然,请楼下的高手解释。
水平有限,说不出所以然,请楼下的高手解释。
作者: iamlimeng 发布时间: 2010-11-13
我也是觉得my $bar = 2 if $i == 2对use strict使了障眼法。
这个bug我曾经头疼了很久,后来终于查出来了,呵呵。
这个bug我曾经头疼了很久,后来终于查出来了,呵呵。
作者: yiten 发布时间: 2010-11-13
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28