我有一个包含此值的哈希。
哈希名称是PG_HASH
{
'PG_3' => {
'REFUND' => '-53702.00',
'PAYMENT' => '1122787.00'
},
'PG_1' => {
'REFUND' => '-72569.00',
'PAYMENT' => '1112523.00'
},
}
除此之外,我还有一个包含与hash相关的值的数组。
@array = {
pg_id => $pg_id,
sum_type => $sum_type,
sum_total => $sum_total,
payment_ref => $payment_ref,
payment_gateway => $payment_gateway
};
现在我想写一个包含标题的CSV文件:
Pg_id TYPE Sumtotal TYPE1 Sumtotal
1 REFUND -72569.00 PAYMENT 1112523.00
3 REFUND -53702.00 PAYMENT 1122787.00
我无法将文件写入单行。 我尝试迭代父哈希但无法将其与数组匹配。
帮助
答案 0 :(得分:0)
#! /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
应该是哈希值,或者您应该处理它(即使用第一个循环)而不是查找其条目。
第三个......名称中带有'hash'的哈希?一个名为@array
的数组?我相信这些不是真名。无论如何,如果有更多关于数据来源的知识,可以编写更好的代码。例如,如果您从数据库查询中填充%PG_HASH
,然后接收@array
作为记录流,那么您应该从数据库的3
中提取PG_3
添加到哈希,你应该遍历数组而不是哈希的键。