【问题标题】:Writing Hash of Hash写散列的散列
【发布时间】:2013-03-15 21:04:22
【问题描述】:

我有一个包含这个值的哈希。

哈希的名字是 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

我无法将文件写入单行。 我尝试遍历父哈希,但无法将其与数组匹配。

帮助

【问题讨论】:

  • 显示你尝试过的代码,这样会更容易帮助你修复你的代码。
  • 我试过我的 %write_hash = (); %write_hash = (%pg_id_hash,@list_query); #print Dumper(\%write_hash); while ( ($key, $value) = each %{$write_hash{$pg_id_hash}}){ while (($key1, $value1) = each %key){ print "内键是$key1,值是$value1\ n"; $writer->add_row([$key->{pg_id},$invoice->{$key{pg_id}->{$type}}]); } }
  • @array = { ... }; 没有多大意义。为什么要将单个标量分配给数组?
  • ug,该评论完全无法阅读。如果缺少您的问题,请更新问题本身。
  • 我还需要在 CSV 中写入一些其他值,这些值存储在数组中

标签: perl hash hashmap


【解决方案1】:
#! /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_' . $_-&gt;{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,并且您应该循环遍历数组而不是哈希的键。

【讨论】:

    猜你喜欢
    • 2016-09-04
    • 2012-11-10
    • 2011-03-13
    • 2017-08-22
    • 2019-03-09
    • 2014-05-19
    • 2013-05-16
    • 1970-01-01
    • 2012-12-27
    相关资源
    最近更新 更多