for $i (0..2){
    a();
}
sub a
{
    my $x ;
    in_a();
    print $i,":\t",$x,"\n";
    undef $x;
    sub in_a
    {
      $x++;
      print "in_a:$x\n";
    }
}

--------------等效于
    my $x ;                    #---------------------------------第一个
    in_a();                      #            0++
    print $i,":\t",$x,"\n";
    undef $x;                 #$x被undef,为0

    sub in_a
    {
      $x++;                      #---------------使用的是第一个$x
      print "in_a:$x\n";
    }

    my $x ;
    in_a();                       #---------------使用的是第一个的  0++
    print $i,":\t",$x,"\n";
   undef $x;

    my $x ;
    in_a();                       #---------------使用的是第一次个 1++
    print $i,":\t",$x,"\n";
   undef $x;

结果  1 1 2

另一个示例
     my $x ;
    in_a();                      #使用的是第二次个 0++
    print $i,":\t",$x,"\n";
    undef $x;

    my $x ;                     #---------------------------------第二个
    in_a();                       #---------------使用的是第二个的  1++
    print $i,":\t",$x,"\n";
   undef $x;                      #$x被undef,为0

    sub in_a
    {
      $x++;                      #---------------使用的是第二个的
      print "in_a:$x\n";
    }

    my $x ;
    in_a();                       #---------------使用的是第二个的 0++
    print $i,":\t",$x,"\n";
   undef $x;

结果  1 2 1


2009/8/23 孙树昌 <[email protected]>

> 我解释错了,应该是跟嵌套函数有关,我需要看看那篇文档  [?]
>
> 2009/8/23 zhang jiaqiang <[email protected]>
>
> 非常感谢回复。(正在看给出的那个链接)
>>
>> 另外,也简要说一下我这边程序的本意,看有是否能有更好的程序组织方式,从而避过这个嵌套函数的问题:
>>
>>
>> 先用Find::File遍历目录找出所有符合条件的XML文件,然后对每个XML文件进行解析,用XML::Parser,我把startElement放在了这个Parser_XML函数内部,结果在对这个函数里变量$tag_count处理时发现了这个问题:
>>
>>
>> 我觉得startElement和$$tag_count都和XML处理有关,直觉应该放在Parser_XML内部;如果把$tag_count放在程序的最外围声明,可以解决这个问题,但是感觉从逻辑上有点说不过去。
>>
>> use strict;
>> # main begin
>> .....
>>
>> find( \&Wanted,$dir);
>>
>> sub Wanted
>> {
>>     if ( $_ =~ /some reg/ ){
>>         Parser_XML($_);
>>     }
>> }
>>
>> sub Parser_XML {
>>     my $xmlfile = shift;
>>     my $tag_count;
>>         $parser->setHandlers( Start => \&startElement );
>>     $parser->parsefile($xmlfile);
>>     print "There is $count in this xml file\n";
>>
>>     sub startElement {
>>         ......
>>         $tag_count++ if $element == 'TAG';
>>     }
>>
>> }
>>
>>
>>
>> Best regards
>> Zhang JiaQiang
>>
>>
>>
>>  2009/8/23 Qiang (James) <[email protected]>
>>
>>> zhang jiaqiang wrote:
>>>
>>> > 大家好,
>>> >
>>> > 新手想不太明白一个变量作用的问题,请帮忙看看。
>>> >
>>> > 我的问题是如何理解$x后两次没有值,为什么在函数in_a里还有值?而且第三次循
>>> > 环的时候这个值怎么成2了?
>>>
>>>  简单的解释是嵌套函数的原因。复杂的这里讲的很清楚,就不和你重复了。。
>>>
>>>
>>> http://perl.apache.org/docs/general/perl_reference/perl_reference.html#my____Scoped_Variable_in_Nested_Subroutines
>>>
>>> 另外,没有特别需要,没有人会这么写 Perl 程序。
>>>
>>> Qiang
>>>
>>>
>>> >
>>> > 简化的程序如下:
>>> >
>>> > for $i (0..2){
>>> >     a();
>>> > }
>>> > sub a
>>> > {
>>> >     my $x ;
>>> >     in_a();
>>> >     print $i,":\t",$x,"\n";
>>> >     undef $x;
>>> >     sub in_a
>>> >     {
>>> >       $x++;
>>> >       print "in_a:$x\n";
>>> >     }
>>> > }
>>> >
>>> > 执行结果:
>>> > in_a:1
>>> > 0:      1
>>> > in_a:1
>>> > 1:
>>> > in_a:2
>>> > 2:
>>> >
>>> >
>>> >
>>> > Best regards
>>> > Zhang JiaQiang
>>> >
>>> >
>>> > >
>>>
>>>
>>>
>>>
>>
>> >>
>>
>

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

<<inline: 330.gif>>

回复