2009年8月26日星期三

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

我晕,看到 undef my $x; 我还以为是你在用一个我没见过的新功能呢,原来你也没见
过啊.

On Wed, Aug 26, 2009 at 11:55:48AM +0800, flw wrote:
> 在没有驾驭好闭包之前,
> 绝不要用嵌套的 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>
>
> >

--

Thanks & Regards

Changying Li


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

没有评论: