2013-03-26 121 views
-1

我有一个散列包含此值。写散列哈希

哈希的名称是PG_HASH

{ 
     'PG_3' => { 
        'REFUND' => '-53702.00', 
        'PAYMENT' => '1122787.00' 
       }, 
     'PG_1' => { 
        'REFUND' => '-72569.00', 
        'PAYMENT' => '1112523.00' 
       }, 
    } 

除了这个我也有包含与哈希值的数组。

@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 

我不能写在一行中的文件。 我试着迭代父散列,但无法与数组匹配。

帮助

+2

在您尝试的地方显示代码,然后帮助您修复代码会更容易。 – 2013-03-26 06:36:46

+0

我试过我的%write_hash =(); %write_hash =(%pg_id_hash,@ list_query); #print Dumper(\%write_hash); (($ key1,$ value1)= each%key)while(($ key,$ value)= each%{$ write_hash {$ pg_id_hash}}){ print {Inner key is $ key1 and value is $值1 \ n“; $ writer-> add_row([$ key - > {pg_id},$ invoice - > {$ key {pg_id} - > {$ type}}]); } } – Peus 2013-03-26 06:43:19

+0

'@array = {...};'没有多大意义。为什么要将单个标量分配给数组? – ikegami 2013-03-26 06:43:27

回答

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应该是一个散列,或者你应该处理它(即,使用第一个循环)而不是查找它的条目。

第三个...名字中带有“散列”的散列?一个名为@array的数组?我相信这些不是真名。无论如何,更好的代码可以写在更多的知识,你的数据来自来自哪里。例如,如果您从数据库查询中填充%PG_HASH,然后将@array作为记录流接收,则应在数据库的PG_3中提取3,然后再添加到散列中,并且应该遍历数组而不是密钥的散列。