免费注册 查看新帖 |

Chinaunix

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

foreach循环结束后变量自动释放吗?真奇怪 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-09-18 17:45 |只看该作者 |倒序浏览
foreach $key (@keys)
{
  if($key =~ /\w+OraClient\w+/i)
  {print "北京\n";
    print "内部的key值为:$key\n";       
    last;
  }
  
  elsif($key =~ /\w+OraDb\w+/i)
  {
    last;
  }
  else
  {
    print "在您的机器上没有安装Oracle数据库\n";
    exit;
  }
}
print "key值为:$key\n";

红色的部分已经执行了,$key也被赋值了,为什么foreach循环结束后$key没值了呢

[ 本帖最后由 zhouhaiming 于 2007-9-18 17:47 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-09-18 18:01 |只看该作者
a 你是否用了 use strict;
b 你的$key的作用域是哪块

[ 本帖最后由 perljoker 于 2007-9-18 18:03 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2007-09-18 18:04 |只看该作者
用use strict;了

论坛徽章:
0
4 [报告]
发表于 2007-09-18 18:07 |只看该作者
#!/usr/bin/perl
use strict;
use Win32::Registry;

my $reg_obj;
my @keys;
my $key;
my ($type, $value);

my (@head,@data);
my $stack_point = -1;

$::HKEY_LOCAL_MACHINE->Open("SOFTWARE\\ORACLE", $reg_obj)
    or die "在您的机器上没有安装Oracle数据库: $^E";
   
$reg_obj->GetKeys(\@keys);
foreach $key (@keys)
{
  if($key =~ /\w+OraClient\w+/i)
  {
#          $key = $_;
    last;
  }
  elsif($key =~ /\w+OraDb\w+/i)
  {
#          $key = $_;
    last;
  }
  else
  {
    print "在您的机器上没有安装Oracle数据库\n";
    exit;
  }
}

$::HKEY_LOCAL_MACHINE->Open("SOFTWARE\\ORACLE\\"."$key", $reg_obj)
    or die "不能打开注册表项: $^E";
。。。
死活不行,见鬼了!

论坛徽章:
0
5 [报告]
发表于 2007-09-18 18:14 |只看该作者
恩,我试验了,貌似$key在foreach那里用完就被回收了
具体机理我也不明白,不知道foreach怎么把main里面的也回收了
请教高人吧,要不然,只能foreach (@keys){  $key=$_;   }

论坛徽章:
0
6 [报告]
发表于 2007-09-18 18:24 |只看该作者
大致就是外层的$variable,内层可见
内层内部使用之后,会销毁内部变量
然后还原外部变量,貌似my的特征
全局变量,偶自己也糊涂

论坛徽章:
0
7 [报告]
发表于 2007-09-18 18:39 |只看该作者
是啊,这地方真是太奇怪了!请懂的朋友指点一下啊!先谢了!

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2007-09-18 19:45 |只看该作者
以下摘自 perldoc perlsyn:
  1. The "foreach" loop iterates over a normal list value and sets the
  2. variable VAR to be each element of the list in turn. If the variable is
  3. preceded with the keyword "my", then it is lexically scoped, and is
  4. therefore visible only within the loop. Otherwise, the variable is
  5. implicitly local to the loop and regains its former value upon exiting
  6. the loop. If the variable was previously declared with "my", it uses
  7. that variable instead of the global one, but it's still localized to the
  8. loop. This implicit localisation occurs *only* in a "foreach" loop.
复制代码

如果看不懂的话,本版精华区有中文版的大骆驼:
  1. 循环变量只在循环的动态或者词法范围内有效。如果该变量事先用 my 定义,那么它隐含地是在词法范围里。这样,对于任何在词法范围之外定义的函数它都是不可见的,即使是在循环里调用的函数也看不到这个变量。不过,如果在范围里没有词法定义,那么循环变量就是局部化的(动态范围)全局变量;这样就允许循环内调用的函数访问它。另外,循环变量在循环前拥有的值将在循环退出之后自动恢复。
复制代码


顺便说一句,大骆驼上面有大量的文字和 perldoc 是完全一样的,而大骆驼是有中文版的,也就是说,perldoc 里有很多文字
都可以从大骆驼中译本中找到汉语翻译——感谢何伟平先生!

因此,碰到不理解的地方的时候,多看看 perldoc,或者翻翻本版精华区。
或者:继续死等。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP