2009年8月22日星期六

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

zhang jiaqiang wrote:
> 非常感谢回复。(正在看给出的那个链接)
>
> 另外,也简要说一下我这边程序的本意,看有是否能有更好的程序组织方式,从而
> 避过这个嵌套函数的问题:
>
> 先用Find::File遍历目录找出所有符合条件的XML文件,然后对每个XML文件进行解
> 析,用XML::Parser,我把startElement放在了这个Parser_XML函数内部,结果在
> 对这个函数里变量$tag_count处理时发现了这个问题:
>
> 我觉得startElement和$$tag_count都和XML处理有关,直觉应该放在Parser_XML内
> 部;如果把$tag_count放在程序的最外围声明,可以解决这个问题,但是感觉从逻
> 辑上有点说不过去。
>

我的答案是看情况..

如果这只是用一次就仍的程序,或者是个100,200行的程序,没__必要__考虑的这
么周到(关于这方面你可以 google 下 "premature optimization is the root of
all evil" :) ) 。你可以把和 Parser_XML 相关的函数放在一起。常用的是:

sub main { parse_xml(); report(); }

sub parse_xml {}

##### 所有和 parse_xml 相关的帮助函数. 习惯性的把帮助函数用下划线和主函
数分开。

sub _startElement {}
sun _endElement {}


另外一种情况是你在写的程序会被重复使用,或是变的很复杂时,那么你还是好好
的设计一下吧:一般解决方法是把 parse xml 这部分放到单独的 package 里。在
主程序只调用 parse_xml 即可,而不把帮助函数暴露出来。

其他人或许还有别的方法...

oh, 有空的话推荐你看看 Perl Best Practice 这本书,会帮助你成为一个好的
Perl 程序员。


Qiang

> 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 <mailto: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 访问该论坛
-~----------~----~----~----~------~----~------~--~---

没有评论: