我不在学校或其他任何地方,但我有一个我想完成的示例测试。我不是百分百肯定从哪里开始(如上所述,我对Perl来说是全新的,但真的,真的很想进入它)。
给出一个表'邮件':
CREATE TABLE mailing (
addr VARCHAR(255) NOT NULL
);
邮件表最初将为空。每天都会添加新地址。预计该表将存储至少10,000,000个电子邮件地址和100,000个域。
编写一个perl脚本,用于更新另一个表,该表按域名保存每日电子邮件地址数。
使用此表按计数报告前50个域名,按最近30天的百分比增长率与总数进行比较。
注意
- 您必须使用提供的DB.pm
进行所有数据库交互,并且必须按原样使用它(除连接设置外,不能修改DB.pm)。
不应修改原始邮寄表。
所有处理必须在Perl中完成(例如,没有复杂的查询或子查询)
这是DB.pm
package GUI::DB;
use strict;
use DBI;
use vars qw(@ISA @EXPORT);
use Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(dbConnect query);
#
# dbConnect - connect to the database, get the database handle
#
sub dbConnect {
# Read database settings from config file:
my $dsn = "DBI:mysql:database=test";
my $dbh = DBI->connect( $dsn,
'',
'',
{ RaiseError => 1 }
);
return $dbh;
}
#
# query - execute a query with parameters
# query($dbh, $sql, @bindValues)
#
sub query {
my $dbh = shift;
my $sql = shift;
my @bindValues = @_; # 0 or several parameters
my @returnData = ();
# issue query
my $sth = $dbh->prepare($sql);
if ( @bindValues ) {
$sth->execute(@bindValues);
} else {
$sth->execute();
}
if ( $sql =~ m/^select/i ) {
while ( my $row = $sth->fetchrow_hashref ) {
push @returnData, $row;
}
}
# finish the sql statement
$sth->finish();
return @returnData;
}
__END__
我经常使用PHP和有趣的东西,但Perl就在我身边。
答案 0 :(得分:2)
以下是将记录插入DBI
表的Perl mailing
用法示例:
use DBI;
$dbh = DBI->connect('DBI:mysql:databasename', 'username', 'password'
) || die "Could not connect to database: $DBI::errstr";
$dbh->do('INSERT INTO mailing VALUES(?)', 'test@test.com');
$dbh->disconnect();
答案 1 :(得分:1)
鉴于规则规定您必须使用query
中的DB.pm
方法,然后:
my $dbh = dbConnect() or die "A horrible death";
query($dbh, "INSERT INTO Mailing(addr) VALUES(?)", 'someone@example.com');
DB.pm
模块有缺陷,因为它没有提供错误返回指示 - 它依赖于DBI RaiseError来生成错误。它也没有提供终止数据库连接的方法。
DB.pm中的代码很松散。 dbConnect()
方法是:
sub dbConnect {
# Read database settings from config file:
my $dsn = "DBI:mysql:database=test";
my $dbh = DBI->connect( $dsn,
'',
'',
{ RaiseError => 1 }
);
return $dbh;
}
可能是:
sub dbConnect
{
# Read database settings from config file:
my $dsn = "DBI:mysql:database=test";
return DBI->connect($dsn, '', '', { RaiseError => 1 });
}
这是6行而不是13行,实际上比原来更容易阅读。