在理解如何從 DB 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 回圈中作業,但我只在第二個鍵值回圈中得到最后一個結果。
我在這里做錯了什么。我確定這很簡單。非常感謝。
uj5u.com熱心網友回復:
OP 需要更好地指定問題并閱讀DBI模塊。
DBI 模塊呼叫了fetchall_hashref也許 OP 可以使用它。
uj5u.com熱心網友回復:
在顯示的代碼中,將記錄分配給具有相同鍵的散列會逐行覆寫前一個,并保留最后一個。相反,它們應該累積在合適的資料結構中。
由于有相當多的行(我們被告知 351 行),一個選項是頂級陣列,每本書都有 hashrefs
my @all_books;
while (my @records = $sth->fetchrow_array()) {
my %book;
@book{qw(AuthorID TitleID Title PubYear)} = @records;
push @all_books, \%book;
}
現在我們有一個書籍陣列,每本書都由四個引數索引。這使用散列切片將多個鍵值對分配給散列。
另一種選擇是頂級散列,其中包含四個與書籍相關的引數的鍵,每個引數的值都有一個 arrayref,其中包含來自所有記錄的條目
my %books;
while (my @records = $sth->fetchrow_array()) {
push @{$books{AuthorID}}, $records[0];
push @{$books{TitleID}}, $records[1];
...
}
現在可以通過作者/標題/等,并輕松恢復每個引數的其他引數。
從資料庫讀取資料時,添加一些檢查總是一個好主意。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/464655.html
