2009年8月25日星期二

[PerlChina] Re: 变量作用域的问题

在没有驾驭好闭包之前,
绝不要用嵌套的 sub,除非你明白自己在做什么。

其实这和嵌套函数的关系也不大啦,
主要是 sub 里面不要用到 sub 以外的变量,所有的输入都走 sub 参数接口。
除非你就是想把那个变量当全局变量用,那么可以建议你在当初就用 our 声明它,而不是 my

另外就是前面树昌兄所说,
使用use strict;编程,基本上就不会出现莫名其妙的问题了。

我再补充一下:
用 Devel::Peek 可以很清楚地看到到底发生了什么。

D:\MoChou>cat ttt.pl
use strict;
use warnings;

use Devel::Peek;

my $x=3;
in_a();
undef my $x;

sub in_a
{
    print Dump($x);
    $x++;
    print "in_a: $x\n";
}

in_a();
in_a();

D:\MoChou>ttt
"my" variable $x masks earlier declaration in same scope at D:\MoChou\ttt.pl lin
e 8.
SV = NULL(0x0) at 0x37054
  REFCNT = 2
  FLAGS = (PADBUSY,PADMY)      # 从这里可以清楚地看到,你的第二个 undef my $x 这个写法实际上是有问题的,前面的警告也说明 Perl 解释器检测到了这一点。不妨揣测一下:【也许你还没有学会如何使用 undef】,undef my $x 这种用法我真的是第一次见到。
in_a: 1
SV = PVIV(0x38e34) at 0x37054
  REFCNT = 2
  FLAGS = (PADBUSY,PADMY)
  IV = 1
  PV = 0
in_a: 1
SV = PVIV(0x38e34) at 0x37054
  REFCNT = 2
  FLAGS = (PADBUSY,PADMY,IOK,POK,pIOK,pPOK)
  IV = 1
  PV = 0x1821b1c "1"\0
  CUR = 1
  LEN = 4
in_a: 2

D:\MoChou>

--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

没有评论: