LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1056|回复: 5

[已分析][常用]foreach的疑惑

[复制链接]
发表于 2004-4-11 21:53:58 | 显示全部楼层 |阅读模式
#!/usr/bin/perl
@list=(1,2,3,4,5);
foreach $temp (@list){
if($temp==2){
$temp=20;
print("@list\n");
}
}
执行完程序输出的@list=(1,20,3,4,5)
请问数组list的值是怎么改变的?
   
发表于 2004-4-12 00:07:52 | 显示全部楼层

如果你在循环里改变该变量,列表里的对应元素也会被改变

看书的时候认真点吧,我想这一点书中说的很清楚
 楼主| 发表于 2004-4-12 00:46:42 | 显示全部楼层
最初由 roby 发表
如果你在循环里改变该变量,列表里的对应元素也会被改变

看书的时候认真点吧,我想这一点书中说的很清楚

这个我知道,但我不明白它是怎么改变的?
发表于 2004-4-12 01:00:53 | 显示全部楼层

回复: foreach的疑惑

最初由 justto 发表
#
[code]!/usr/bin/perl
@list=(1,2,3,4,5);
foreach $temp (@list){ #这里每个@list都按顺序赋一次值给$temp.
      if($temp==2){
           $temp=20;  # 当$temp == 2,就赋值给20,
           print("@list\n"); 这里只有一次循环打印出了数据,就是这次。
      }
}
执行完程序输出的@list=(1,20,3,4,5)
请问数组list的值是怎么改变的?
   


发表于 2004-4-12 01:08:19 | 显示全部楼层
ft
当第二次循环的时候
$temp被赋予了$list[1] 也就是 2
根据你的代码
执行
$temp=20
注意:这里改变了$temp
所以相应的$list[1]也就改变了
$list[1]变成 20 了
@list=(1,20,3,4,5)
所以最后结果就是 1 20 3 4 5

如果还不明白我就没法了
书上说的明明白白的

下面是骆驼书的原话,已经说的很明白了,perl就是这么故意设计的。
--------------------------
foreach VAR (LIST){
...
}
如果LIST完全包含可赋值元素(通常也就是说变量,而不是枚举常量),你可以通过修改循环内的VAR来修改每个变量。这是因为foreach循环的索引变量隐含的是你逐一取出的列表的每个元素的别名。

-----------------------------
 楼主| 发表于 2004-4-12 01:22:26 | 显示全部楼层
我是这样想的,程序前后并没有给$list[1]另赋值,为什么它的值却由2变成了20呢?
“这是因为foreach循环的索引变量隐含的是你逐一取出的列表的每个元素的别名。”现在看了这句话,似乎明白了一点。:thank
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表