免费注册 查看新帖 |

Chinaunix

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

foreach与$_,是BUG吗 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-05-13 13:55 |只看该作者 |倒序浏览
本帖最后由 pxczy 于 2011-05-13 16:03 编辑

在$i=2的循环里,foreach到的值居然是空的,如果foreach与while中的一个不用$_或者去掉for循环或者去掉while循环,就都不会有问题,这个是BUG吗?还是什么。。。求解,多谢大家
  1. my @path=(1,2);
  2. for(my $i=1;$i<3;$i++)
  3. { print "最外层循环 i=$i\n";
  4.     foreach $_ (@path)
  5.       {  if (!$_)
  6.               {print "中层foreach循环的值为空,出错 \n" }
  7.          else {print "中层foreach循环正常,值为$_\n"};      
  8.          open(FH, "<1.txt") ;   #有2行内容的1.txt
  9.          while (<FH>)
  10.             {print "内层FH循环正常\n";
  11.             }
  12.          close FH;         
  13.       };
  14. };
复制代码
结果是
  1. 最外层循环 i=1
  2. 中层foreach循环正常,值为1
  3. 内层FH循环正常
  4. 内层FH循环正常
  5. 中层foreach循环正常,值为2
  6. 内层FH循环正常
  7. 内层FH循环正常
  8. 最外层循环 i=2
  9. 中层foreach循环的值为空,出错
  10. 内层FH循环正常
  11. 内层FH循环正常
  12. 中层foreach循环的值为空,出错
  13. 内层FH循环正常
  14. 内层FH循环正常
复制代码

论坛徽章:
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
2 [报告]
发表于 2011-05-13 14:21 |只看该作者
代码没什么大问题,无法重现你的问题。只提一点 for if while 这些语法结构的 BLOCK 最后不需要跟 ; 不过不影响

论坛徽章:
0
3 [报告]
发表于 2011-05-13 14:24 |只看该作者
不太懂是为什么。

不过我把my @path=(1,2); 放在for循环里面后,就能得到正确的结果了。就是你去掉for循环的情况。
求解。

论坛徽章:
0
4 [报告]
发表于 2011-05-13 14:33 |只看该作者
本帖最后由 cinanine 于 2011-05-13 13:05 编辑

foreach $_ (@path) ==>

    foreach my $x (@path)
  1. my @path=(1,2,3,4);
  2. for(1..3){
  3.     print "最外层循环 i=$_\n";

  4.     for my $x (@path){  
  5.         if (!$x){print "中层foreach循环的值$x \n" }
  6.         else {print "中层foreach循环正常,值为$x\n"}  
  7.    
  8.         open(FH, "<1.txt") ;   #有2行内容的1.txt

  9.         while (<FH>){
  10.             print "内层FH循环正常\n";
  11.              }

  12.         close FH;         
  13.         }
  14. }
复制代码
  1. 最外层循环 i=1
  2. 中层foreach循环正常,值为1
  3. 内层FH循环正常
  4. 中层foreach循环正常,值为2
  5. 内层FH循环正常
  6. 中层foreach循环正常,值为3
  7. 内层FH循环正常
  8. 中层foreach循环正常,值为4
  9. 内层FH循环正常
  10. 最外层循环 i=2
  11. 中层foreach循环正常,值为1
  12. 内层FH循环正常
  13. 中层foreach循环正常,值为2
  14. 内层FH循环正常
  15. 中层foreach循环正常,值为3
  16. 内层FH循环正常
  17. 中层foreach循环正常,值为4
  18. 内层FH循环正常
  19. 最外层循环 i=3
  20. 中层foreach循环正常,值为1
  21. 内层FH循环正常
  22. 中层foreach循环正常,值为2
  23. 内层FH循环正常
  24. 中层foreach循环正常,值为3
  25. 内层FH循环正常
  26. 中层foreach循环正常,值为4
  27. 内层FH循环正常
复制代码

论坛徽章:
0
5 [报告]
发表于 2011-05-13 14:35 |只看该作者
你内外两层循环都用$_迭代,难免冲突出错。

论坛徽章:
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
6 [报告]
发表于 2011-05-13 14:40 |只看该作者
本帖最后由 zhlong8 于 2011-05-13 14:44 编辑

抱歉刚才为省事把里面的读文件部分给注释掉了。确实像你写的那样。

平时用因为怕冲突都用带名字的循环,这个也是头次遇到。没有留意到文档哪里有讲这个

在程序最后加上句 say Dumper \@path; 发现连 @path 都被改变了。这里算是个 bug 或者说未定义用法,至于原理我再看看

论坛徽章:
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 [报告]
发表于 2011-05-13 14:53 |只看该作者
本帖最后由 zhlong8 于 2011-05-13 14:55 编辑

搞定了,略微改了下加了点 debug 用的打印。用 perl -MO=Deparse t.pl 得到
  1. my(@path) = ('a', 'b');
  2. foreach my $z (1, 2) {
  3.     print "\327\356\315\342\262\343\321\255\273\267 i=$z\n";
  4.     print Dumper(\@path);
  5.     foreach my $_ (@path) {
  6.         say '---------->', $_;
  7.         if (not $_) {
  8.             say "\326\320\262\343foreach\321\255\273\267\265\304\326\265\316\252\277\325,\263\366\264\355";
  9.         }
  10.         else {
  11.             print "\326\320\262\343foreach\321\255\273\267\325\375\263\243,\326\265\316\252$_";
  12.         }
  13.         die $! unless open FH, '<1.txt';
  14.         while (defined($_ = <FH>)) {
  15.             print "\304\332\262\343FH\321\255\273\267\325\375\263\243->$_";
  16.         }
  17.         close FH;
  18.         say $_;
  19.     }
  20. }
  21. say 'x' x 80;
  22. say Dumper(\@path);
复制代码
注意读文件的时候那里是 defined ($_ = <FH>) 又因为 for 循环的时候变量用的是 alias 所以会改变原来的 @path。看反编译的结果肯定是没问题的,但是感觉还是个 bug,while (<FH>) 编译的问题

论坛徽章:
0
8 [报告]
发表于 2011-05-13 15:53 |只看该作者
代码没什么大问题,无法重现你的问题。只提一点 for if while 这些语法结构的 BLOCK 最后不需要跟 ; 不过不 ...
zhlong8 发表于 2011-05-13 14:21



谢谢告之,以后不写了:wink:

论坛徽章:
0
9 [报告]
发表于 2011-05-13 15:54 |只看该作者
中层和内层的$_可能冲突吧

论坛徽章:
0
10 [报告]
发表于 2011-05-13 15:54 |只看该作者
本帖最后由 pxczy 于 2011-05-13 15:57 编辑
foreach $_ (@path) ==>

    foreach my $x (@path)
cinanine 发表于 2011-05-13 14:33



    我在帖子里已说了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP