我正在嘗試獲取兩個哈希陣列,并將它們轉換為單個資料結構。這個新結構將是 hashref,其中每個鍵的值是一個哈希陣列。
下面是我正在轉換的兩個結構 - 這是 selectall_arrayref 與兩個單獨查詢中的 slice 引數的結果:
$mappings = [
{
bill_id => '100',
linked_bill_id => '1000',
},
{
bill_id => '100',
linked_bill_id => '1001',
},
{
bill_id => '200',
linked_bill_id => '2000',
},
{
bill_id => '200',
linked_bill_id => '2001',
},
{
bill_id => '200',
linked_bill_id => '2002',
},
];
$fees = [
{
bill_id => '100',
payment_id => '500',
version => 1,
has_fee => 0,
},
{
bill_id => '100',
payment_id => '501',
version => 2,
has_fee => 1,
},
{
bill_id => '1000',
payment_id => '502',
version => 1,
has_fee => 0,
},
{
bill_id => '1001',
payment_id => '503',
version => 1,
has_fee => 0,
},
{
bill_id => '200',
payment_id => '504',
version => 1,
has_fee => 0,
},
{
bill_id => '2000',
payment_id => '505',
version => 1,
has_fee => 0,
},
{
bill_id => '2001',
payment_id => '506',
version => 1,
has_fee => 0,
},
{
bill_id => '2002',
payment_id => '507',
version => 1,
has_fee => 1,
},
];
使用這兩種結構,我想創建一個新結構,其中鍵是 bill_id from $mappings,值是 bill_id 及其所有linked_bill_ids 的費用陣列。它應該像:
$VAR1 = {
'100' => [
{
'bill_id' => '100',
'payment_id' => '500',
'version' => 1,
'has_fee' => 0,
},
{
'bill_id' => '100',
'payment_id' => '501',
'version' => 2,
'has_fee' => 1,
},
{
'bill_id' => '1000',
'payment_id' => '502',
'version' => 1,
'has_fee' => 0,
},
{
'bill_id' => '1001',
'payment_id' => '503',
'version' => 1,
'has_fee' => 0,
},
],
'200' => [
{
'bill_id' => '200',
'payment_id' => '504',
'version' => 1,
'has_fee' => 0,
},
{
'bill_id' => '2000',
'payment_id' => '505',
'version' => 1,
'has_fee' => 0,
},
{
'bill_id' => '2001',
'payment_id' => '506',
'version' => 1,
'has_fee' => 0,
},
{
'bill_id' => '2002',
'payment_id' => '507',
'version' => 1,
'has_fee' => 1,
},
]
};
我的代碼在下面,這讓我非常接近但不完全是我想要的。此外,我相信有一種比我目前正在做的更好的方法來轉換這些資料結構。也許這可以通過一次將兩個陣列的映射/greps鏈接在一起來以某種方式簡化?
我正在尋求有關如何正確解決此問題的幫助,以及有關如何做得更好的建議。
my $bill_fees;
for my $bill (@$mappings) {
push @{ $bill_fees->{bill_fee}{$bill->{bill_id} },
grep { $_->{bill_id} eq $bill->{bill_id} } @$fees;
my @linked_bills = map { $_->{linked_bill_id} }
grep { $_->{bill_id} eq $bill->{bill_id} }
@$mappings;
for my $linked_bill (@linked_bills) {
push @{ $bill_fees->{bill_fee}{$bill->{bill_id}} },
grep { $_->{bill_id} eq $linked_bill } @$fees;
}
}
上面的方法有點不對。它給了我上面列出的預期結構,但是對于每個 bill_id 鍵,我也最終得到:
use Data::Dumper;
print Dumper($bill_fees->{bill_fee});
'100' => [
$VAR1->{'100'}[0],
$VAR1->{'100'}[1],
$VAR1->{'100'}[2],
$VAR1->{'100'}[3],
],
'200' => [
$VAR1->{'200'}[0],
$VAR1->{'200'}[1],
$VAR1->{'200'}[2],
$VAR1->{'200'}[3],
$VAR1->{'200'}[0],
$VAR1->{'200'}[1],
$VAR1->{'200'}[2],
$VAR1->{'200'}[3],
]
我認為這是因為映射中有多個相同的 bill_id。因此,例如,bill_id = 100會回圈兩次。
uj5u.com熱心網友回復:
首先,提取費用賬單 ID 到 bill_fees 鍵的映射。然后,在適當的賬單 ID 下分離費用:
my %idmap = map {
$_->{bill_id} => $_->{bill_id},
$_->{linked_bill_id} => $_->{bill_id}
} @$mappings;
my $bill_fees;
for my $fee (@$fees) {
push @{ $bill_fees->{ $idmap{ $fee->{bill_id} } } }, $fee;
}
請注意每個賬單 ID 如何鏈接到自身,以簡化檢索。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/506224.html
