免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1892 | 回复: 3

foreach是如何工作的?(已解决) [复制链接]

论坛徽章:
0
发表于 2010-03-11 22:48 |显示全部楼层
本帖最后由 addbe 于 2010-03-11 23:49 编辑

以下是我的代码
  1. #! /usr/bin/perl -w
  2. foreach (@ARGV){
  3. print "@ARGV\n";
  4. print "hello $_\n";
  5.   print "begin !@ARGV\n";
  6.   if (/(-\w)/){
  7.   print "# !$_!\n";
  8.   push @options,$_;
  9.   $a=shift (@ARGV);
  10.   print "a is $a\n";
  11. print "options are @options\n";
  12.   }
  13. print "\n";
  14. print "options are @options\n";
  15.   print "end @ARGV\n";
  16. print "#######\n";
  17. }
  18. print "@options\n";
  19. print  "@ARGV\n";
复制代码
运行的结果是
perl 3.pl -a -s 1 2
-a -s 1 2
hello -a
begin !-a -s 1 2
# !-a!
a is -a
options are -a

options are -a
end -s 1 2
#######
-s 1 2
hello 1
begin !-s 1 2

options are -a
end -s 1 2
#######
-s 1 2
hello 2
begin !-s 1 2

options are -a
end -s 1 2
#######
-a
-s 1 2

foreach不是说是逐个取元素么?为啥-s没有去取?

论坛徽章:
0
发表于 2010-03-11 22:55 |显示全部楼层
不要在foreach的同时对数组进行增删操作(pop/shift/push/unshift等)。

论坛徽章:
0
发表于 2010-03-11 23:09 |显示全部楼层
谢谢。我也在想问题应该是在我在循环里面对数组操作的缘故。
但是我是不太理解这个数组在foreach的时候如何工作。
或者这么说

  1. #! /usr/bin/perl -w
  2. foreach (@ARGV){
  3. print "@ARGV\n";
  4. .........
  5.   print "begin !@ARGV\n";
  6. .............
  7.   $a=shift (@ARGV);
  8. .......
  9.   print "end @ARGV\n";
  10. .....
  11. print  "@ARGV\n";
复制代码
并不是同一个?
那实际上这里面发生了什么事情呢

论坛徽章:
0
发表于 2010-03-11 23:48 |显示全部楼层
俺明白鸟
第一次的时候foreach是从第一个元素开始,但是其中我做了一次shift的工作
第二次的时候foreach应该是记住了从第二个元素开始,这个时候的第二个元素因为之前的shift的动作变成原来的第三个元素。
果然还是把foreach用while写出来容易看点
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP