foreach循环结束后变量自动释放吗?真奇怪

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没值了呢

a 你是否用了 use strict;
b 你的$key的作用域是哪块

用use strict;了
#!/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";
。。。
死活不行,见鬼了!
恩,我试验了,貌似$key在foreach那里用完就被回收了
具体机理我也不明白,不知道foreach怎么把main里面的也回收了
请教高人吧,要不然,只能foreach (@keys){  $key=$_;   }
大致就是外层的$variable,内层可见
内层内部使用之后,会销毁内部变量
然后还原外部变量,貌似my的特征
全局变量,偶自己也糊涂
是啊,这地方真是太奇怪了!请懂的朋友指点一下啊!先谢了!
以下摘自 perldoc perlsyn:

[Copy to clipboard] [ - ]
CODE:
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.

如果看不懂的话,本版精华区有中文版的大骆驼:

[Copy to clipboard] [ - ]
CODE:
循环变量只在循环的动态或者词法范围内有效。如果该变量事先用 my 定义,那么它隐含地是在词法范围里。这样,对于任何在词法范围之外定义的函数它都是不可见的,即使是在循环里调用的函数也看不到这个变量。不过,如果在范围里没有词法定义,那么循环变量就是局部化的(动态范围)全局变量;这样就允许循环内调用的函数访问它。另外,循环变量在循环前拥有的值将在循环退出之后自动恢复。

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

因此,碰到不理解的地方的时候,多看看 perldoc,或者翻翻本版精华区。
或者:继续死等。