免费注册 查看新帖 |

Chinaunix

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

foreach中调用函数的奇怪现象 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-11 11:27 |只看该作者 |倒序浏览
废话少说, 请看:

test1.pl:
------------------
#!/usr/bin/perl -w

my $var1="dd";
my @var2=("aa", "bb", "cc";
while( $var1=shift(@var2)) {
&func;
}

sub func {
print "Value of var1var1\n";
}
--------------------
执行结果:
Value of var1:aa
Value of var1:bb
Value of var1:cc

test2.pl
-------------------------------
#!/usr/bin/perl -w

my $var1="dd";
my @var2=("aa", "bb", "cc";
foreach $var1 (@var2) {
&func;
}

sub func {
print "Value of var1var1\n";
}
----------------------

执行结果:
Value of var1:dd
Value of var1:dd
Value of var1:dd

两段代码看上去逻辑上应该等价, 为什么结果不同?

论坛徽章:
0
2 [报告]
发表于 2010-11-11 11:38 |只看该作者
变量作用域的问题。
  1. #!/usr/bin/perl

  2. use strict;
  3. use warnings;

  4. my $var1="dd";
  5. my @var2=("aa", "bb", "cc");
  6. foreach $var1 (@var2) {
  7.         print "$var1\n";
  8.         &func;
  9. }

  10. sub func {
  11.         print "Value of var1 $var1\n";
  12. }
复制代码

论坛徽章:
0
3 [报告]
发表于 2010-11-11 11:42 |只看该作者
回复 2# iamlimeng


  我知道是变量作用域问题, 但为什么foreach怎么这么特殊? 怎么就和while不同了? 求甚解 ....

论坛徽章:
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
4 [报告]
发表于 2010-11-11 12:11 |只看该作者
回复 1# nhw_cs


    perlsyn
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 localisation occurs only in a foreach loop.

论坛徽章:
0
5 [报告]
发表于 2010-11-11 12:48 |只看该作者
回复 3# nhw_cs


    控制变量,建议加my

论坛徽章:
0
6 [报告]
发表于 2010-11-11 14:00 |只看该作者
回复  nhw_cs


    perlsyn
zhlong8 发表于 2010-11-11 12:11



    先翻配套手册这种习惯是解决问题的有效途径!

论坛徽章:
0
7 [报告]
发表于 2010-11-11 14:21 |只看该作者
foreach 隐式的声明了  my $var1 它做为一个自己的私有变量用了。


论坛徽章:
0
8 [报告]
发表于 2010-11-11 14:34 |只看该作者
foreach 隐式的声明了  my $var1 它做为一个自己的私有变量用了。
alabos 发表于 2010-11-11 14:21



    上面的英文解释已经说明这个问题了。 到这里对很多人来说问题就结束了, 但我仍认为这不能算是完全的"求甚解". 因为我想肯定很多人都觉得perl这样规定很奇怪, 当然人家这样做肯定有他的原因, 那我们就再进一步问: Perl为什么要这样做? 弄清这个才算到底。而不是仅仅记住这样一个规定.

我其实好像已经知道为什么了, 但我现在还不说 .....

论坛徽章:
0
9 [报告]
发表于 2010-11-11 14:37 |只看该作者
回复  nhw_cs


    控制变量,建议加my
gaochong 发表于 2010-11-11 12:48



   
作为一个05年注册的非新人, 这么唐突的回答令我愕然. 我虽然不是perl高手, 但深谙编程语言的内在本质, 如果是my这样简单的问题, 我会拿来问么? 高手的问题肯定没那么简单 ....

论坛徽章:
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
10 [报告]
发表于 2010-11-11 14:55 |只看该作者
难道楼主所说的深意是指 VAR 其实只是别名,所以这样设计?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP