Chinaunix首页 | 论坛 | 博客
  • 博客访问: 547213
  • 博文数量: 201
  • 博客积分: 7734
  • 博客等级: 少将
  • 技术积分: 1994
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-09 19:18
文章分类

全部博文(201)

文章存档

2011年(28)

2010年(173)

分类:

2010-09-11 00:37:00

第十一章
Perl模块
安装perl模块
1、解压缩后在shell中运行一连串命令就可以了,可以查阅READE或是INSTALL这两个文件。
2、如果此模块使用MakeMaker,那多半可以用如下方式安装:
perl Makefile.PL
make install
如果你没有权限安装到系统全局目录(安装后其他用户也可使用的目录),则可以在Makefile.PL后面加上PREFIX参数。
perl Makefile.PL PREFIX=/Users/fred/lib
3、有些Perl模块的开发者会要求使用另一个辅助模块Module::Build来编译并安装他们的作品。
perl Build.PL
./Build install
4、perl -MCPAN -e shell 
   cpan Module::CoreList LWP CGI:Prototype 这两种方法也可以
使用简单模块:
假如在程序里有个包含路径的长文件名,像是/usr/local/bin/perl,而你想要取文件的basename。这不难,
最后一个斜线之后的部分就是basename(此例中为perl):

#!/usr/bin/perl -w

my $name = "/usr/local/bin/perl";
(my $basename = $name) =~ s
#.*/##;

print $basename;        

如果像上面这样写,实际上有三个问题:
1、由于正则表达式的点号(.)无法匹配换行符。像"/home/fred/flintstone\n/brontosaurus"这样的文件全名。便无法正常运作。
2、这段代码仅仅考虑了Unix下的情况。它假设目录分隔符总是Unix风格的生斜线。而没有考其他系统的情况。如使反斜线或冒号(就是在说windows)
3、我们正在试图解决别人已经解决的问题,如果用File::Basename模块,将很好的解决这个问题。

File::Basename模块:
use File::Basename
my $name = "/usr/local/bin/perl";
my $basename = basename $name;
现在只要这样写就可以达到上面的要求了,而且可以在MacPerl windows VMS等不同的系统上运行,这个模块会自动判断系统。

仅选用模块中的部分函数:
有可以用声明的变量在模块中已经使用了。这样就会产生冲突。
现在只需在File::Basename的use声明中,加上导入列表(import list)来指明要它提供哪些函数,它就不会给你别的函数了。如:

use File::Basename qw/ basename /; 表示只引入basename函数
use File::Basename qw/ /;             表示我们完全不要引入任何函数 也可以写成这样 use File::Basename();
=================
use File::Basename qw/ /;            
#不导入函数名称

my $betty = &dirname($wilma);        
#使用我们自己的子程序$dirname

                                    
#(略去子程序的具体内容)

my $name = "/usr/local/bin/perl";
my $dirname = use File::Basename::dirname $name        
#使用模块中的dirname函数

==================

File:Spec模块:
现在你可以取文件的basename了,这很有用。此外你还常会需要将basename和目录名结合起来,以构造文件的全名。
比如对/home/rootbeer/ice-2.1.txt这样的文件命名,想要为其basename加上前缀:

#!/usr/bin/perl -w

use File::Basename;
print "Please enter a filename:";
chomp(my $old_name = <STDIN>);
my $dirname = dirname $old_name;
my $basename = basename $old_name;
$basename =~ s/^/not/;        
#basename加上前缀

my $new_name = "$dirname/$basename";
rename($old_name, $new_name)
 or warn "Can't rename '$old_name' to '$new_name': $!";
 
#!/usr/bin/perl -w

use File:Spec;
print "Please enter a filename:";
chomp(my $old_name = <STDIN>);
my $dirname = dirname $old_name;
my $basename = basename $old_name;
my $new_name = File:Spec->catfile($dirname, $basename);

rename($old_name, $new_name)
  or warn "Can't rename '$old_name' to '$new_name': $!";
  

  
CGI.pm
[root@linscora ~]
# cat cgi1

#!/usr/bin/perl -w

use CGI qw(:all);
print header("text/plain");
foreach my $param ( param() )
   {
    print "$param: " . param($param) . "\n";
   }
[root@linscora ~]
# perl cgi1

Content-Type: text/plain; charset=ISO-8859-1

[root@linscora ~]
#

=====================
[root@linscora ~]
# cat cgi2

#!/usr/bin/perl -w

use CGI qw(:all);
print header(),
start_html("This is the page title"),
h1( "Input parameters" );
my $list_items;
foreach my $param ( param() )
{
$list_items .= li( "$param: " . param($param) );
}
print ul( $list_items );
print end_html();
[root@linscora ~]
# perl cgi2

Content-Type: text/html; charset=ISO-8859-1

<!DOCTYPE html
    PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "">
<html xmlns="" lang="en-US" xml:lang="en-US">
<head>
<title>This is the page title</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<h1>Input parameters</h1><ul />
</body>
</html>[root@linscora ~]

数据库与DBI:
DBI(数据库接口,Database Interface)模块并未内置于Perl标准发行版本中,但这却是最热门的模块之一,许多人或多或少地需要连接数据库。DBI的美妙之处在于,不管哪种常见的数据库,都可以用相同的接口进行操作,从CSV文件,到Oracle之类的数据库厂商自行提供的。想通盘了解完整细节。<>

安装完DBI之后,你还必须安装DBD(数据库驱动程序,Database Driver)。
DBI是面向对象模块,但你不必为了要用它而去了解OO编程的全部细节。
想要连接数据库,你得use DBI模块,并调用它的connect方法:
use DBI;
$dbh = DBI->connect($data_source, $username, $password);
变量$data_source指定了要连接的数据库信息,以及使用哪一种DBD作底层交互。对PostgreSQL数据库来说,驱动是DBD:Pg模块,所以$data_source就你下面这样:

my $data_source = "dbi:Pg:dbname=name_of_database";
连上数据库之后,就可以开始准备查询、执行查询以及读取查询结果等一系列操作了。

$sth = $dbh->prepare("SELECT * FROM foo WHERE bla");
$sth->execute();
@row_ary = $sth->fetchrow_array;
$sth->finish;
$dbh->disconnect();


习题:
#!/usr/bin/perl -w

use Module::CoreList;
my %modules = ${ $Module::CoreList::version{5.006} };
print join "\n", keys %modules;


阅读(1040) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-09-13 22:11:32

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com