-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

ファイルを 1 行に書き込むことができません。親ハッシュを反復しようとしましたが、それを配列と一致させることができませんでした。

ヘルプ

4

1 に答える 1

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ハッシュである必要があります。または、そのエントリを検索するのではなく、処理する (つまり、最初のループを使用する) 必要があります。

3番目...名前に「ハッシュ」が含まれるハッシュ?@array?という名前の配列 これらは本名ではないと信じています。とにかく、データがどこから来ているかについての知識があれば、より良いコードを書くことができます。たとえば%PG_HASH、データベース クエリから入力し@array、レコードのストリームとして受信する場合は、ハッシュに追加する前3にデータベースから抽出PG_3する必要があり、ハッシュのキーではなく配列をループする必要があります。

于 2013-03-26T13:09:46.773 に答える