简单的Perl脚本(Total Perl Noob,刚刚开始)

时间:2011-05-28 16:20:09

标签: database perl dbi

我不在学校或其他任何地方,但我有一个我想完成的示例测试。我不是百分百肯定从哪里开始(如上所述,我对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就在我身边。

2 个答案:

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