我正在尝试存储对象数组的哈希值,但很困难。
我正在以以下格式从数据库检索数据
身份证 | 钥匙 | 价值1 | 价值2 |
---|---|---|---|
1 | 1 | A | B |
2 | 1 | C | D |
3 | 2 | E | F |
4 | 2 | G | H |
我想将其存储在密钥的哈希中,这些密钥应该包含我的值的列表。
例如
'Key': '1' => { 'Id': '1' => { 'Id' => '1', 'Key' => '1', 'Value1' => 'A', 'Value2' => 'B' },
'Id': '2' => { 'Id' => '2', 'Key' => '1', 'Value1' => 'C', 'Value2' => 'D' }},
'Key': '2' => { 'Id': '3' => { 'Id' => '3', 'Key' => '2', 'Value1' => 'E', 'Value2' => 'F' },
'Id': '4' => { 'Id' => '4', 'Key' => '2', 'Value1' => 'G', 'Value2' => 'H' }}
我的代码就像这样存储值:
$sth = $dbh->prepare("SELECT Id, Key, Value1, Value2 FROM MyTable ORDER BY Id");
$sth->execute();
my $data = $sth->fetchall_hashref('Id');
my %hash;
while ((my $id, my $data) = each (%$data))
{
my $key = $data->{'Key'};
$hash{$key}{$id} = $data;
}
这似乎给了我我想要的结构。
但我不知道如何访问由特定键索引的值列表。
例如如果我访问
my %values = %hash{'2'}
这似乎给了我一个散列的散列,而不是底层散列。
my $values = $hash{'2'}
这似乎给了我底层哈希,但因为它存储为 $ 变量,所以我无法从中获取键或值。 (arg 1 到键的类型必须是散列或数组(不是私有变量))
事实上,我实际上更喜欢简单的对象列表的哈希值,例如
'Key': '1' => [{ 'Id' => '1', 'Key' => '1', 'Value1' => 'A', 'Value2' => 'B' },
{ 'Id' => '2', 'Key' => '1', 'Value1' => 'C', 'Value2' => 'D' }],
'Key': '2' => [{ 'Id' => '3', 'Key' => '2', 'Value1' => 'E', 'Value2' => 'F' },
{ 'Id' => '4', 'Key' => '2', 'Value1' => 'G', 'Value2' => 'H' }]
因为我只想能够通过键迭代我的对象列表。
'Key': '1' => { ... }
不是有效的 Perl。
我认为你实际上想创建以下内容:
'1' => [{ 'Id' => '1', 'Key' => '1', 'Value1' => 'A', 'Value2' => 'B' },
{ 'Id' => '2', 'Key' => '1', 'Value1' => 'C', 'Value2' => 'D' }],
'2' => [{ 'Id' => '3', 'Key' => '2', 'Value1' => 'E', 'Value2' => 'F' },
{ 'Id' => '4', 'Key' => '2', 'Value1' => 'G', 'Value2' => 'H' }]
如果是这样,您所需要的只是以下内容:
my %hash;
while ( my $row = $sth->fetchrow_hashref( 'Id' ) ) {
my $key = $data->{ Key };
push @{ $hash{ $key } }, $data;
}
然后,
$hash{ 1 }
将产生对数组的引用