foreach的问题……
时间:2010-12-14
来源:互联网
本帖最后由 午夜凋零 于 2010-12-14 10:15 编辑
#code 1
@a = (1, 2, 3);
foreach (@a){
$_ ++;
print ;
}
#code 2
foreach (1, 2, 3){
$_ ++;
print ;
}
code 2会报错“Modification of a read-only value attempted at line 3”,code 1没有问题,能通过。
当把两种代码分别改变成 @a = 1..3,foreach (1..3) 时,也是通过的。
知道的朋友帮解释一下为什么吧,谢谢。
#code 1
@a = (1, 2, 3);
foreach (@a){
$_ ++;
print ;
}
#code 2
foreach (1, 2, 3){
$_ ++;
print ;
}
code 2会报错“Modification of a read-only value attempted at line 3”,code 1没有问题,能通过。
当把两种代码分别改变成 @a = 1..3,foreach (1..3) 时,也是通过的。
知道的朋友帮解释一下为什么吧,谢谢。
作者: 午夜凋零 发布时间: 2010-12-14
本帖最后由 zhlong8 于 2010-12-14 10:23 编辑
你没看下代码一中你的 @a 值是不是变了? for 的循环变量只是别名,所以 code1 会改变 @a 的值; code2 因为 1,2,3 是常量,自然无法 ++ 因为它们是 readonly 的。个人认为这个设计挺好的,省掉复制值的开销,在循环改变array值的时候可以省掉索引取值的麻烦,提高运行和书写效率。
perlsyn
你没看下代码一中你的 @a 值是不是变了? for 的循环变量只是别名,所以 code1 会改变 @a 的值; code2 因为 1,2,3 是常量,自然无法 ++ 因为它们是 readonly 的。个人认为这个设计挺好的,省掉复制值的开销,在循环改变array值的时候可以省掉索引取值的麻烦,提高运行和书写效率。
perlsyn
QUOTE:
If any element of LIST is an lvalue, you can modify it by modifying VAR inside the loop. Conversely, if any element of LIST is NOT an lvalue, any attempt to modify that element will fail. In other words, the foreach loop index variable is an implicit alias for each item in the list that you're looping over.
作者: zhlong8 发布时间: 2010-12-14
回复 zhlong8
代码一里的@a确实是改变了。
还有一点,请看下面代码。
foreach(1..3){
$_ ++;
print ;
}
这样也是通过的,这又是为什么呢? 1..3 和 1,2,3 有什么不一样的吗?
谢谢解答。
代码一里的@a确实是改变了。
还有一点,请看下面代码。
foreach(1..3){
$_ ++;
print ;
}
这样也是通过的,这又是为什么呢? 1..3 和 1,2,3 有什么不一样的吗?
谢谢解答。
作者: 午夜凋零 发布时间: 2010-12-14
本帖最后由 zhlong8 于 2010-12-14 10:37 编辑
perl 对 for (a .. b) {} 这样的结构做了优化要不你看 for (1..10000) {} 就要创建一个 10000 个元素的数组了,所以这里它是 iterator,每次都是新创建的值,然后赋值给循环变量(不存在 alias)。
for 就这么两个特殊用法,一下子就被你发现完了,你真牛
perl 对 for (a .. b) {} 这样的结构做了优化要不你看 for (1..10000) {} 就要创建一个 10000 个元素的数组了,所以这里它是 iterator,每次都是新创建的值,然后赋值给循环变量(不存在 alias)。
for 就这么两个特殊用法,一下子就被你发现完了,你真牛
作者: zhlong8 发布时间: 2010-12-14
回复 zhlong8
受教了,非常感谢。
受教了,非常感谢。
作者: 午夜凋零 发布时间: 2010-12-14
本帖最后由 黑色阳光_cu 于 2010-12-14 10:57 编辑
建议写 foreach VAR (LIST)
不写 for VAR (LIST)
建议不要用 print $_, "\n" foreach (1 .. 10) 这样子的后置句法,问题多,比如这样子就语法错了:
print $_, "\n" foreach $_ (1 .. 10) ;
print $elem, "\n" foreach my $elem (1 .. 10) ;
进一步建议,循环都不要用后置的语法
建议写 foreach VAR (LIST)
不写 for VAR (LIST)
建议不要用 print $_, "\n" foreach (1 .. 10) 这样子的后置句法,问题多,比如这样子就语法错了:
print $_, "\n" foreach $_ (1 .. 10) ;
print $elem, "\n" foreach my $elem (1 .. 10) ;
进一步建议,循环都不要用后置的语法
作者: 黑色阳光_cu 发布时间: 2010-12-14
QUOTE:
建议写 foreach VAR (LIST)
不写 for VAR (LIST)
建议不要用 print $_, "\n" foreach (1 .. 10) 这样子 ...
黑色阳光_cu 发表于 2010-12-14 10:54
不写 for VAR (LIST)
建议不要用 print $_, "\n" foreach (1 .. 10) 这样子 ...
黑色阳光_cu 发表于 2010-12-14 10:54
为什么?神兽书不是说Larry喜欢懒孩子吗?
作者: 昭襄王 发布时间: 2010-12-14
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28