+ -
当前位置:首页 → 问答吧 → foreach的问题……

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) 时,也是通过的。
知道的朋友帮解释一下为什么吧,谢谢。

作者: 午夜凋零   发布时间: 2010-12-14

本帖最后由 zhlong8 于 2010-12-14 10:23 编辑

你没看下代码一中你的 @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 有什么不一样的吗?
谢谢解答。

作者: 午夜凋零   发布时间: 2010-12-14

本帖最后由 zhlong8 于 2010-12-14 10:37 编辑

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

进一步建议,循环都不要用后置的语法

作者: 黑色阳光_cu   发布时间: 2010-12-14



QUOTE:
建议写 foreach VAR (LIST)
不写 for VAR (LIST)

建议不要用 print $_, "\n" foreach (1 .. 10) 这样子 ...
黑色阳光_cu 发表于 2010-12-14 10:54



为什么?神兽书不是说Larry喜欢懒孩子吗?

作者: 昭襄王   发布时间: 2010-12-14