Chinaunix

标题: foreach循环结束后变量自动释放吗?真奇怪 [打印本页]

作者: zhouhaiming    时间: 2007-09-18 17:45
标题: foreach循环结束后变量自动释放吗?真奇怪
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 编辑 ]
作者: perljoker    时间: 2007-09-18 18:01
a 你是否用了 use strict;
b 你的$key的作用域是哪块

[ 本帖最后由 perljoker 于 2007-9-18 18:03 编辑 ]
作者: zhouhaiming    时间: 2007-09-18 18:04
用use strict;了
作者: zhouhaiming    时间: 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";
。。。
死活不行,见鬼了!
作者: perljoker    时间: 2007-09-18 18:14
恩,我试验了,貌似$key在foreach那里用完就被回收了
具体机理我也不明白,不知道foreach怎么把main里面的也回收了
请教高人吧,要不然,只能foreach (@keys){  $key=$_;   }
作者: perljoker    时间: 2007-09-18 18:24
大致就是外层的$variable,内层可见
内层内部使用之后,会销毁内部变量
然后还原外部变量,貌似my的特征
全局变量,偶自己也糊涂
作者: zhouhaiming    时间: 2007-09-18 18:39
是啊,这地方真是太奇怪了!请懂的朋友指点一下啊!先谢了!
作者: flw    时间: 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,或者翻翻本版精华区。
或者:继续死等。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2