从数据库 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 可以将其用于某些用途。
在理解如何从数据库 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 可以将其用于某些用途。