Perl - 存储和检索对象数组的哈希值

问题描述 投票:0回答:1

我正在尝试存储对象数组的哈希值,但很困难。

我正在以以下格式从数据库检索数据

身份证 钥匙 价值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' }]

因为我只想能够通过键迭代我的对象列表。

perl hash
1个回答
0
投票

'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 }
将产生对

数组的引用
© www.soinside.com 2019 - 2024. All rights reserved.