Linux中国  设为主页
 收藏本站
 
当前位置: > 首页 ->编程语言 ->CGI ->perl模块和包的使用
  相关分类: 
ASP
ViualBasic
UML / Rational Rose
PHP4/PHP5
Perl
JAVA/JSP教程
Delphi
ColdFusion
CGI
C/C++
ASP.NET
XML
  站内搜索: 
热门文章排行
热门文章排行 windows下Perl开发环境的安装和配置(04-28)
perl与Mysql连接(04-28)
实战 FastCGI(04-28)
获取随机的密码(04-28)
perl模块和包的使用(04-28)
精采文章排行
精采文章排行 CGI教学:CGI常用环境变量(04-28)
关于CGI读写COOKIE的编程(04-28)
CGI的安全(二)(04-28)
CGI的安全(一)(04-28)
获取随机的密码(04-28)
  ·关于CGI读写COOKIE的编程·CGI的安全(二)·CGI的安全(一)·获取随机的密码·在CGI中实现session的想法和实现·CGI绝对路径和相对路径的简便设置方法·使用脚本下载网页·利用Perl开发Internet/Intranet应用之二(·利用Perl开发Internet/Intranet应用之二(

perl模块和包的使用

作者:Webmaster   来源:Linuxdby.com   点击:   日期:2007-04-28 [收藏] [投稿]

  IE是否经常中毒?推荐您

$response 包括web页面的内容:
$content = $response->content;
如果我们只需要http头来检查一个页面的修改时间,或是它的存在,我们可以使用一个head的请求:
$request = new HTTP::Request HEAD => $uri;
request()方法自动处理重定向。我们可以从最后得到的页面覆盖原来的url,就像这样 :
$uri = $response->request->uri;

HTML::Parser
一旦我们有了一个web页面,我们希望找到上面的所有的网页。HTML::Parser解析web页面。我们并不是直接使用HTML::Parser这个模块。然而我们创建使用它的一个子程序:
use HTML::Parser;

package HTML::Parser::Links;

use base qw(HTML::Parser);
为了解析一个web页面,我们创建一个我们子程序的对象,传递网页的内容到parse方法。
$parser = new HTML::Parser::Links;
$parser->parse($content);
$parser->eof;
parse像回调一样调用我们子程序中的方法:
sub start
{
my($parser, $tag, $attr, $attrseq, $origtext) = @_;
无论什么时候parse定义了一个html标签的开始,它就调用start子程序。参数是:
$parser
HTML::Parser::Links 对象
$tag
html的名字,比如:h1,a,strong
%$attr
一个键值对的哈希列表
@$attrseq
在列表中的属性列表,以它们最初的排列
$origtext
标签的原始文本
我们只是关心一些标签和它们的属性。如果找到一个基本的标签,我们捕获这个url,以便我们可以解析相关的连接

$tag eq 'base' and
$base = $attr->{href};
我们找到一个(锚)标签,我们捕获href标签

$tag eq 'a' and $attr->{href} and
$href = $attr->{href};
还有name(为了碎片)标签

$tag eq 'a' and $attr->{name} and
$name = $attr->{name};

Pod::Usage
使用pod格式在程序中嵌入一个perl文档是很平常的。Pod::Usage这个模块解析它所找到的所有的源程序中的pod格式的文本,并把它打印出来 。这使得增加程序的说明和帮助很容易。
pod2usage(); # print synopsis
pod2usage(VERBOSE=>1); # print synopsis and options
pod2usage(VERBOSE=>2); # print entire man page
当命令行上有错误时,pod2usage这个模块是被经常用的,它使得在打印出pod文档以前退出程序。

Packages

模块和包是相关的,但却又是不同的概念。一个模块是包含perl源代码的文档。一个包是包含perl子程序或者变量的名字空间。
模块的作者一般都把他们的代码放在模块后面命名的包里。这样可以把它们封装起来,并避免名字的冲突。相反的,包的作者可能把包放在模块里,以便其他人可以使用这个程序。

不过,我们还可以通过申明一个包,把包直接嵌入我们的程序里。
package Spinner;
我们在我们的程序里使用包是为了:
产生一个内部的界面
支持封装
避免名字的冲突
如果我们写模块的话,我们应该
产生一个完整的,一般性的界面
选择一个好的模块的名字
提供文档
然而,包仅仅在我们的程序里才是可见的,因此,我们不必太正式:我们可以以我们的方便来创建和使用包。这里有我们在linkcheck里使用的包
Spinner
HTML::Parser::Links
Page
Link
Spinner
-t 选项显示一个微调控制项。这是一个1个字符的操作,由下列字符分割:
| / -
下面是这个完整的包:
package Spinner;

use vars qw($N @Spin);

@Spin = ('|', '/', '-', '');

sub Spin
{
print STDERR $Spin[$N++], "r";
$N==4 and $N=0;
}

这个包并不是太大。$N,@Spin,&Spin都在Spinner::这个包的名字空间里。为了预备这个spinner,我们这样调用 :
Spinner::Spin();

package Spinner;
my $N;
my @Spin = ('|', '/', '-', '');
如果Spinner是一个模块,这也许会更好 。然而,在这里这并不会真正提供任何的封装。File-scoping并不妨碍包的声明,所以任何的File-scoping词汇都会分享同个名字空间,从而和在整修文档的其它的File-scoping词汇产生名字冲突。

HTML::Parser::Links
是HTML::Parser的一个子程序。上面展示的一些片断说明了它的基本的界面接口。在我们的子程序中,我们有额外的实时的数据来代替解析后的html页面。以及访问器(accessors)返回关于这个页面的信息。

新的方法是我们的构造器:
sub new
{
my($class, $base) = @_;

my $parser = new HTML::Parser;
$parser->{base } = $base;
$parser->{links} = [];
$parser->{fragment} = {};

bless $parser, $class
}

为了产生一个HTML::Parser::Links对象,我们
产生一个HTML::Parser对象
增加我们的即时的变量到对象
在我们的类中重新神圣引用
下面是完整的开始的方法:
sub start
{
my($parser, $tag, $attr, $attrseq, $origtext) = @_;

$tag eq 'base' and
$parser->{base} = $attr->{href};

$tag eq 'a' and $attr->{href} and do
{
my $base = $parser->{base};
my $href = $attr->{href};
my $uri = new_abs URI $href, $base;
push @{$parser->{links}}, $uri;
};



 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<

上一页 1 23 4 下一页

上一篇:联网调试CGI程序心得   下一篇:Perl的运算符号字符概述
文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论

   相关文章:
·CGI教学:CGI常用环境变量

   文章评论:(1条)
  
 请留名: 匿名评论   点击查看所有评论 论坛讨论
 

 声明:刊登此文章是为了传递更多信息,文章内容仅供参考,转载请注明出处。