免费注册 查看新帖 |

Chinaunix

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

for 和foreach的区别?? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-25 10:55 |只看该作者 |倒序浏览
  1. #!/usr/bin/perl
  2. @arr=(1,2,3,4,5);
  3. for ($i=0;$i<@arr;$i++){
  4. open(FH,"./1.pl");
  5. while(<FH>;){
  6. #啥也不干
  7. }

  8. }
  9. foreach(@arr){
  10. print $_."\n";
  11. }
复制代码
结果是打印1 2 3 4 5
  1. #!/usr/bin/perl
  2. @arr=(1,2,3,4,5);
  3. foreach (@arr){
  4. open(FH,"./1.pl");
  5. while(<FH>){
  6. #啥也不干
  7. }

  8. }
  9. foreach(@arr){
  10. print $_."\n";
  11. }
复制代码
结果是打印5个空行

perl版本是:v5.8.8 built for x86_64-linux-thread-multi

请问是什么原因啊? for 和foreach干的事不一样么??

论坛徽章:
78
双子座
日期:2013-10-15 08:50:09天秤座
日期:2013-10-16 18:02:08白羊座
日期:2013-10-18 13:35:33天蝎座
日期:2013-10-18 13:37:06狮子座
日期:2013-10-18 13:40:31双子座
日期:2013-10-22 13:58:42戌狗
日期:2013-10-22 18:50:04CU十二周年纪念徽章
日期:2013-10-24 15:41:34巨蟹座
日期:2013-10-24 17:14:56处女座
日期:2013-10-24 17:15:30双子座
日期:2013-10-25 13:49:39午马
日期:2013-10-28 15:02:15
2 [报告]
发表于 2012-10-25 11:26 |只看该作者
第二个改变了$_的值

论坛徽章:
0
3 [报告]
发表于 2012-10-25 11:50 |只看该作者
@yybmsrs
同意:
  1. #!/usr/bin/perl
  2. @arr=(1,2,3,4,5);
  3. foreach (@arr){
  4. open(FH,"./1.pl");
  5. while(<FH>){  # $_在这里被改变了
  6. #啥也不干
  7. }

  8. }
  9. foreach(@arr){
  10. print $_."\n";
  11. }
复制代码

论坛徽章:
0
4 [报告]
发表于 2012-10-25 14:11 |只看该作者
回复 3# kk861123
  1. #!/usr/bin/perl
  2. @arr=(1,2,3,4,5);
  3. @arr1=(9,90,91);
  4. foreach (@arr){

  5. foreach(@arr1){ #这里应该也会改变$_的值啊??
  6. #啥也不干
  7. }
  8. }

  9. foreach(@arr){
  10. print $_."\n";
  11. }
复制代码
我改写成这样难道就不改变$_的值了??

论坛徽章:
0
5 [报告]
发表于 2012-10-25 16:04 |只看该作者
trbingqq 发表于 2012-10-25 14:11
回复 3# kk861123 我改写成这样难道就不改变$_的值了??


我也解释不了为什么while会将$_改变而foreach/for不会。还是请出版主吧@zhlong8

例子:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. while (<DATA>) {
  5.     print "in  : $_";
  6.     last;
  7. }
  8. print "out : $_";
  9. __DATA__
  10. A
  11. B
  12. C
复制代码

论坛徽章:
0
6 [报告]
发表于 2012-10-25 16:41 |只看该作者
找到关于foreach的说法:
The foreach loop iterates over a normal list value and sets the variable VAR to be each element of the list in turn. If the variable is preceded with the keyword my, then it is lexically scoped, and is therefore visible only within the loop. Otherwise, the variable is implicitly local to the loop and regains its former value upon exiting the loop. If the variable was previously declared with my, it uses that variable instead of the global one, but it's still localized to the loop. This implicit localization occurs only in a foreach loop.

注意最后一句

论坛徽章:
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 [报告]
发表于 2012-10-25 17:14 来自手机 |只看该作者
while 那里是 Perl 众多设计缺陷之一

论坛徽章:
0
8 [报告]
发表于 2012-10-25 20:01 |只看该作者
确实是个值得注意的地方

论坛徽章:
0
9 [报告]
发表于 2012-10-26 10:23 |只看该作者
回复 7# zhlong8


    版主一锤定音
walklan 该用户已被删除
10 [报告]
发表于 2012-10-27 09:55 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP