for $i (0..2){
a();
}
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();
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";
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";
my $x ;
in_a(); #---------------使用的是第一次个 1++
print $i,":\t",$x,"\n";
undef $x;
结果 1 1 2
结果 1 1 2
另一个示例
my $x ;
in_a(); #使用的是第二次个 0++
print $i,":\t",$x,"\n";
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";
{
$x++; #---------------使用的是第二个的
print "in_a:$x\n";
}
my $x ;
in_a(); #---------------使用的是第二个的 0++
print $i,":\t",$x,"\n";
undef $x;
结果 1 2 1
结果 1 2 1
2009/8/23 孙树昌 <wss12cn@gmail.com>
我解释错了,应该是跟嵌套函数有关,我需要看看那篇文档
2009/8/23 zhang jiaqiang <zhangjiaqiang@gmail.com>
非常感谢回复。(正在看给出的那个链接)
另外,也简要说一下我这边程序的本意,看有是否能有更好的程序组织方式,从而避过这个嵌套函数的问题:
先用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) <shijialee@gmail.com>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 讨论组"论坛。
要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛
-~----------~----~----~----~------~----~------~--~---
订阅:
博文评论 (Atom)
没有评论:
发表评论