从数据库 select 创建一个 perl 散列

Create a perl hash from a db select

在理解如何从数据库 select 语句创建 Perl 散列时遇到一些问题。

$sth=$dbh->prepare(qq{select authorid,titleid,title,pubyear from books});
$sth->execute()  or die DBI->errstr;
while(@records=$sth->fetchrow_array()) {
    %Books = (%Books,AuthorID=> $records[0]);
    %Books = (%Books,TitleID=> $records[1]);
    %Books = (%Books,Title=> $records[2]);
    %Books = (%Books,PubYear=> $records[3]);
    print qq{$records[0]\n}
    print qq{\t$records[1]\n};
    print qq{\t$records[2]\n};
    print qq{\t$records[3]\n};
}
$sth->finish();
while(($key,$value) = each(%Books)) {
    print qq{$key --> $value\n};
}

打印语句在第一个 while 循环中工作,但我只在第二个键值循环中得到最后的结果。

我在这里做错了什么。我敢肯定这很简单。非常感谢。

在所示代码中,将记录分配给具有相同键的散列会覆盖前一个记录,一行接一行,最后一个保留。相反,它们应该累积在合适的数据结构中。

由于有相当多的行(我们被告知有 351 行),一个选项是 top-level 数组,每本书都有 hashrefs

my @all_books;

while (my @records = $sth->fetchrow_array()) {
    my %book;
    @book{qw(AuthorID TitleID Title PubYear)} = @records;
    push @all_books, \%book;
}

现在我们有一个书籍数组,每本书都由四个参数索引。 这使用散列 slice 将多个 key-value 对分配给一个散列。

另一个选项是 top-level 散列,其中包含四个 book-related 参数的键,每个参数的值都是一个包含所有记录条目的数组引用

my %books;

while (my @records = $sth->fetchrow_array()) {
    push @{$books{AuthorID}}, $records[0];
    push @{$books{TitleID}}, $records[1];
    ...
}

现在可以通过 authors/titles/etc,并轻松恢复每个参数的其他参数。

从数据库中读取时添加一些检查总是一个好主意。

OP 需要更好地说明问题并阅读 DBI 模块。

DBI 模块调用 fetchall_hashref 也许 OP 可以将其用于某些用途。