Q1:什么是Perl模块,它主要包括哪些?各模块主要的作用是什么?如何使用?
答:Perl模块跟JAR包,C库一样,是具有特定用途的程序,可供开发者直接调用,可通过如下语句查找某一模块是否已经安装:
$perldocCGI
需要Perl 发布包中没有的模块,可以在CAPN 上:http://search.cpan.org, 或kobes’上:http://kobesearch.cpan.org◆查找。
[1]数据库和DBI
DBI(数据库接口 (databaseinterface))模块不是 Perl 默认附带的,但它是最常用的模块之一,因为大多数用户都需要连接到某种类型的数据库上。 DBI 漂亮的地方在于,对于绝大多数常用的数据库,其接口都是一样的,从 csv(comma-separatedvalue)文件到大型的数据库服务器如 Oracle。它有 ODBC 的驱动程序,某些驱动程序是由厂商提供的。想了解全面的详细信息,可以参见 Perl DBI 编程(Porgramming the Perl DBI)( O’ Reilly)。也可以查看 DBI 的网站: http://dbi.perl.org/。当安装了 DBI 后,也需要安装 DBD(数据库驱动程序(databasedriver))。从 CPAN 上搜索 DBD,会返回一长串的结果。根据数据库服务器,及其版本安装正确的数据库驱动程序。DBI 是一个 OO 模块,但不需要完全了解 OO 编程之后才开始使用它;根据文档中的例子就可以开始了。要连接数据库,需要use DBI 模块,并调用connect 方法。下面展示如何连接PostgreSQL数据库
useDBI;
$dbh = DBI->connect($data_source, $username, $password);
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();
Q1:Perl还有哪些常用高级技术?
答:
[1]利用eval捕获错误
(1)eval是一个表达式(不是像while 或foreach 那样的控制结构),因此结
尾处的分号是必须的。
(2)当执行eval 块时发生了通常的严重错误,eval 块会停止执行,但程序不会崩溃。当eval 结束时,你想知道它是正常结束的,
还是发生了严重错误。这些结果放在特殊变量$@之中。如果eval 为你捕捉了严重错误,则$@中将有程序失败的原因,可
能如:Illegal division by zero atmy_program line 12。如果没有错误,则$@为空。这意味着$@是一个有用的Boolean(true/false)
值(真,表示有错误)
(3)eval块是真正的一个块,因此其中可以有新的局部(my)变量。
(4)如果eval 捕捉到了严重错误,则返回值为undef 或空列表,依赖于其context。
foreachmy $person (qw/ fred wilma betty barney dino pebbles /) {
eval {
open FILE, “<$person”
or die “Can’ t open file ‘$person’: $!”;
my($total, $count);
while (
$total += $_;
$count++;
}
my $average = $total/$count;
print “Average for file $person was $average\n”;
&do_something($person, $average);
};
if ($@){
print “An error occurred ($@), continuing\n”;
}
}
[2]使用grep得到列表元素
有时只需要列表中的某些项。例如只需要数字列表中的奇数,或者文本中提到Fred 的行。如你在本节中将看到的,可以使用grep 从列表中得到某些项
my@odd_numbers = grep {$_ % 2} 1 ..1000;
my@matching_lines = grep /\bfred\b/i,
[3] 使用 map 对列表项进行变换
另一个通常的操作是,转变列表项的格式。例如,假设你想将一列数字按照货币数字的格式输出,如第十三章的子程序&big_money。我们不想修改原始数据,只想修改一份拷贝的进行输出。
my@data = (4.75, 1.5, 2, 1234, 6.9456, 12345678.9, 29.95);
my @formatted_data = map {&big_money($_) } @data;
[4] Slices
通常,我们只需处理列表中的部分元素。
slice 的下标可以是任意的序列,甚至可以是重复的。下例将具有十个元素的列表中的五个元素取出:
my@names = qw{ zero one two three four five six seven eight nine };
my @numbers = ( @names)[ 9, 0, 2, 1, 0 ];
print “Bedrock @numbers \n”; #输出 Bedrock nine zero two one zero