免费注册 查看新帖 |

Chinaunix

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

[求助]关于在foreach中shift后,$_的奇怪现象 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-14 16:11 |只看该作者 |倒序浏览
晚生初学perl,今天练习时想写一个自己看不懂的脚本,结果写了一个……汗……的确看不懂……
  1. #!/usr/bin/perl
  2. my @rray = 0..9;
  3. foreach (@rray) {
  4.         print "\$_=$_\t";
  5.         shift @rray;
  6.         print "\$_=$_\t";
  7.         $_ = "_";
  8.         print "@rray\n";
  9. }
复制代码

主要是很费解它的输出:

  1. $_=0    $_=0    1 2 3 4 5 6 7 8 9
  2. $_=2    $_=2    _ 3 4 5 6 7 8 9
  3. $_=4    $_=4    3 _ 5 6 7 8 9
  4. $_=6    $_=6    _ 5 _ 7 8 9
  5. $_=8    $_=8    5 _ 7 _ 9
复制代码

不难看出,在$_对应的元素被shift掉之后,$_仍然存在,且给它附的值仍然是有效的——即便它对应的元素已经不存在了,请问这时候$_代表的是什么?

[ 本帖最后由 ZAROK 于 2009-12-14 16:12 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-12-14 16:23 |只看该作者
If any part of LIST is an array, foreach will get very confused if you add or remove elements within the loop body, for example with splice. So don't do that.


perldoc perlsyn

从逻辑上说不通的行为 标准似乎也没定意

论坛徽章:
0
3 [报告]
发表于 2009-12-14 16:30 |只看该作者
sounds meanful....

我只是觉得……如果捂上输出的第一行,其他行的结果是可以理解的,只是第一行输出不合逻辑
……或许foreach是在报复我吧

论坛徽章:
0
4 [报告]
发表于 2009-12-14 16:48 |只看该作者
这种情况下如果不在loop body给$_赋值,但保持shift,我试了一下,foreach并没有报错说“Asshole! I'm confused!”
输出是

  1. $_=0    $_=0    1 2 3 4 5 6 7 8 9
  2. $_=2    $_=2    2 3 4 5 6 7 8 9
  3. $_=4    $_=4    3 4 5 6 7 8 9
  4. $_=6    $_=6    4 5 6 7 8 9
  5. $_=8    $_=8    5 6 7 8 9
复制代码

这个结果是符合逻辑的,foreach严格的在第一次循环用$_代表数组的第一个元素,第二次循$_环代表第二个元素(尽管是shift之后的第二个,但的确是“当前的”第二个),然后以此类推……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP