bugfix> perl > 投稿

共通の要素を持つ配列を解析して、カウント情報を含む新しいハッシュを作成しようとしています。私が作成しようとしている構造は次のようなものです。

{
    var1 => [
        cat1 => 50,
        cat2 => 3,
        cat3 => 5
    ],
    var2 => [
       cat2 => 12,
       cat4 => 4,
       cat5 => 1
    ]
}

配列のハッシュを作成する方法は知っていますが、内部配列に上記のようにカウントのハッシュを表現させる方法を理解することはできません。私が持っているデータ構造は、さらに多くの要素を持つ配列の配列です。しかし、おもちゃの例として、ここで私が取り組んでいるものです:

#!/usr/bin/perl
use strict;
use warnings;
use autodie;
use Data::Dump;
my @array = (
    ["cat1", "var1"],
    ["cat2", "var1"],
    ["cat2", "var1"],
    ["cat2", "var2"],
    ["cat1", "var1"],
    ["cat1", "var1"],
);
my %counts;
for my $elem (@array) {
    push(@{$counts{$elem->[1]}}, $elem->[0]);
}
dd \%counts;

その push() を変更する方法がわかりません @array のループから派生したカウントで匿名配列をプッシュするための呼び出し(悪い名前、私は知っている..デモ目的のためだけ)。

これは2つのステップでできると思います。しかし、 %counts に要素をロードするときに要素を数える簡単な方法があるはずです 。誰かが私がここで間違っている場所を教えてもらえますか?

回答 1 件
  • 予想されるデータ構造に欠陥があります。第2レベルのハッシュ参照が必要です。

    {
        var1 => [       # {
            cat1 => 50,
            cat2 => 3,
            cat3 => 5
        ],              # }
        var2 => [       # {
           cat2 => 12,
           cat4 => 4,
           cat5 => 1
        ]               # }
    }
    
    

    配列を使用すると、キーと値のペアを適切に保持できず、順序付けられたリストが作成されます。

    ハッシュを使用すると、varを最初のキーとして使用し、その中の猫を数えることができます。 push する必要はありません  どこでも。 Perlの自活 すべてを作成してくれます。

    my %counts;
    foreach my $elem (@array) {
        #        var             cat 
        $counts{ $elem->[1] }->{ $elem->[0] }++;
    }
    
    

    出力:

    {
        var1   {
            cat1   3,
            cat2   2
        },
        var2   {
            cat2   1
        }
    }
    
    

    詳細については、perldsc、perlref、およびperlreftutをご覧ください。

あなたの答え