2011-05-28 96 views
0

我不在学校或任何东西,但我有这个例子测试,我想完成。我不是100%确定从哪里开始的(正如我所说的,我对Perl完全陌生,但真的很想进入它)。简单的Perl脚本(总Perl Noob,刚刚开始)

给定一个表 '邮寄':

CREATE TABLE mailing (
    addr VARCHAR(255) NOT NULL 
); 

邮件表最初是空的。新地址将每天添加。预计该表格将存储至少10,000,000个电子邮件地址和100,000个域名。

编写一个perl脚本,该脚本更新另一个表,该表包含通过其域名保持每日电子邮件地址数的另一个表。

使用此表根据过去30天的百分比增长计数排序的前50个域名与总数进行比较。

注意 - 必须使用所提供的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

它会用于垃圾邮件:)? – 2011-05-28 16:32:06

+1

什么是DB.pm?你的意思是Perl的DBI? – 2011-05-28 16:33:54

+0

另外我不认为有人会为你编写一个程序,显示你到目前为止已经出现的问题以及你的问题,然后人们可能会提供帮助。 – 2011-05-28 16:34:45

回答

2

这里是一个插入一条记录mailing表的Perl DBI使用的例子:

use DBI; 
$dbh = DBI->connect('DBI:mysql:databasename', 'username', 'password' 
       ) || die "Could not connect to database: $DBI::errstr"; 
$dbh->do('INSERT INTO mailing VALUES(?)', '[email protected]'); 
$dbh->disconnect(); 
+0

我真的把自己踢在这里,但直到这一点,随着一本书,我只能运行简单,易于编写脚本,可以从终端运行。我从来没有使用.pm扩展名的数据库,也不知道如何在我的linux机器上进行设置。任何帮助? – 2011-05-28 16:42:29

+1

原来我的书有一段关于DBI的相当长的篇章,所以我会在询问更多问题之前仔细阅读。尽管如此,感谢这个例子,当我真正完成本章的时候会牢记这一点。 – 2011-05-28 16:47:25

1

鉴于该规则规定,你必须使用query方法从DB.pm,则:

my $dbh = dbConnect() or die "A horrible death"; 
query($dbh, "INSERT INTO Mailing(addr) VALUES(?)", '[email protected]'); 

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,实际上是更容易比原来的阅读。

+0

查询()中的“if(@bindValues)”更为不稳定。它没有任何用处...... – tadmc 2011-05-28 19:15:26