在没有驾驭好闭包之前,
绝不要用嵌套的 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 访问该论坛
-~----------~----~----~----~------~----~------~--~---
没有评论:
发表评论