第十一章
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;
|
阅读(1114) | 评论(1) | 转发(0) |