#! /usr/bin/env perl
use strict;
use warnings;
use feature 'say';
use Perl6::Form;
my %PG_HASH = (
'PG_3' => {
'REFUND' => '-53702.00',
'PAYMENT' => '1122787.00'
},
'PG_1' => {
'REFUND' => '-72569.00',
'PAYMENT' => '1112523.00'
},
);
my @array = (
{
pg_id => 1,
sum_type => 'imaginary',
sum_total => '1000000.00',
payment_ref => 'imag',
payment_gateway => '.us'
},
{
pg_id => 3,
sum_type => 'imaginary',
sum_total => '500000.00',
payment_ref => 'imag',
payment_gateway => '.us'
},
);
say "Pg_id TYPE Sumtotal TYPE1 Sumtotal";
for (@array) {
my $pg = $PG_HASH{'PG_' . $_->{pg_id}};
print form "{<<<<} REFUND {>>>>>>>} PAYMENT {>>>>>>>>}",
$_->{pg_id}, $pg->{REFUND}, $pg->{PAYMENT};
}
say '';
say "Pg_id TYPE Sumtotal TYPE1 Sumtotal";
for (keys %PG_HASH) {
my ($id) = $_ =~ /PG_(\d+)/;
my ($info) = grep { $_->{pg_id} == $id } @array;
print form "{<<<<} PAYMENT {>>>>>>>>} SUM TOTAL {>>>>>>>>}",
$id, $PG_HASH{$_}{PAYMENT}, $info->{sum_total};
}
出力:
Pg_id TYPE Sumtotal TYPE1 Sumtotal
1 REFUND -72569.00 PAYMENT 1112523.00
3 REFUND -53702.00 PAYMENT 1122787.00
Pg_id TYPE Sumtotal TYPE1 Sumtotal
3 PAYMENT 1122787.00 SUM TOTAL 500000.00
1 PAYMENT 1112523.00 SUM TOTAL 1000000.00
Perl6::Formはフォーマットされた出力 (CSV 出力ではない) を生成します。そのリンクをたどって、私がここで行うよりも多くのことを学びましょう。
このコードは、ハッシュを参照して配列をループすることと、配列を参照してハッシュのキーをループすることの両方を示しています。
このコードもひどいです。
まず、キーを生成してハッシュを参照します: 'PG_' . $_->{pg_id}
. これができないはずです。ハッシュはこのようなキーを持つべきではありません。pg_id によって直接キー付けされた場合 (したがって、1
ではなくのキー'PG_1'
)、ループは次のようになります。
for (@array) {
my $id = $_->{pg_id};
print form "{<<<<} REFUND {>>>>>>>} PAYMENT {>>>>>>>>}",
$id, $PG_HASH{$id}{REFUND}, $PG_HASH{$id}{PAYMENT};
}
次に、ハッシュのすべてのキーについて配列全体を (単一の結果ではなく複数の潜在的な結果を) 検索することにより、配列を参照します。おそらく@array
ハッシュである必要があります。または、そのエントリを検索するのではなく、処理する (つまり、最初のループを使用する) 必要があります。
3番目...名前に「ハッシュ」が含まれるハッシュ?@array
?という名前の配列 これらは本名ではないと信じています。とにかく、データがどこから来ているかについての知識があれば、より良いコードを書くことができます。たとえば%PG_HASH
、データベース クエリから入力し@array
、レコードのストリームとして受信する場合は、ハッシュに追加する前3
にデータベースから抽出PG_3
する必要があり、ハッシュのキーではなく配列をループする必要があります。