[PerlChina] 求助如何动态加载模块, dynamic load Module

Qiang ( James ) Li shijialee at gmail.com
Fri Dec 7 19:39:58 PST 2007


不好意思,这几天比较忙.... 下面是我得回复 :

rorot wrote:
> 在07-12-3,*Qiang ( James ) Li* 写道:
> 

> 
>     另外,我碰巧要用从网页的 DOM 里提取数据,试了一下 Web::Scraper 发现很好
>     用。
>     http://search.cpan.org/~miyagawa/Web-Scraper-0.24/lib/Web/Scraper.pm
>     文档里的例子就能说明它的用途。
> 
>  
> 一下子没看明白Web::Scraper的优势。这个。。。。。。。

我也是刚开始. Web::Scraper 的优势是你可以根据 CSS (class/span 名称) 和
html tag 来获得你想要的内容.

作者 use.perl 上有个例子:

use Web::Scraper;
use URI;

my $uri =
URI->new("http://wikisubtitles.net/ajax_loadShow.php?show=65&season=3");
my $scraper = scraper {
    process '//td[@class="idioma"][text()=~"English \(US\)"]/..//a',
'links[]' => '@href';
};
my $result = $scraper->scrape($uri);

解释一下就是寻找使用 class 名称为 idioma 的 td, 内容匹配 English (US),
然后把 td 里面的链接抓来. 这个模块是基于 ruby scraper 工具,目前 perl 版
的文档很少,基本上要看 ruby 的文档才可以.

> 
>     程序是运行在 mod_perl 下的么?如果是的话那就没有必要动态加载。即使在
>     plain cgi 下,多加载一个或两个模块对运行速度到底有多大区别?
> 
>     常说的一句话:在你没有找到瓶颈的时候,不要做无谓的提速。
> 
>     动态加载你可以使用 require :
> 
>     if ( $output_type = 'xml' ) {
>         eval { require XML::OUTPUT };
>         die if $@;
>         print $xml_output;
>     }
> 
> 
> 这话说的对,用eval{ require...}处理动态加载,不失为一种方法。不过我现把 
> 该用到的块先包进来再说。其余在以后调优。另外,我有个关于mod_perl的问题。 
> 就是自己的代码包了很多自己写的模块,然后在mod_perl下跑,但是由于在开发阶 
> 段,所以经常性的修改被脚本包含的模块,但是却不见mod_perl立即更新。而且其 
> 启动时加载的原来的老模块的内容。搞的我每次修改了模块,都要重启一次 
> Apache, 这个问题如何解决呢?
> 
> 

mod_perl 文档里有详细的讲,这是 1.x 的文档:
http://perl.apache.org/docs/1.0/guide/porting.html#Reloading_Modules_and_Required_Files
开发时可以使用 Apache::Reload. 但在 production 里就不适合了.

Qiang


More information about the China-pm mailing list