0

コードが実行されるたびに同じ形式に簡単に並べ替えることができるように構造化する必要がある、大量のデータを含む大きな 1 次元ハッシュがあります。

元のハッシュ データ:

{
'datetime' => 'datetime value',
'param_name' => 'param name',
'param_value' => 'param value',
'category' => 'category name'
}

現在のデータ構造:

{
  'datetime value' => {
    'category' => {
        'param_name' = > 'param name',
        'param_value' => 'param value
    }
  }
}

この構造はコードでほぼ構築できますが、すべてのカテゴリを除いて、同じキー名を持つ複数の param_names と param_values が存在する可能性があります。

私が抱えている問題は、複数のパラメーター名/値がある場合、最後のペアのみが新しいデータ構造に保存されることです。

キーは一意でなければならないことを知っているので、これを解決する方法はまだよくわかりません。

構造が構築されたら、出力で順序が常に同じになるように、datetime、次に param_name に基づいてデータをソートする方法を理解する必要があります。

4

3 に答える 3

2

最初の例と 2 番目の例の違いを見ると、構造が少しずれていると思います。これはあなたが望むものにより多く一致すると思います:

{
     DATE       => date_time_value,
     PARAMETERS =>  {
                       param_name1 => parameter_value1,
                       param_name2 => parameter_value2
                    }
}

このように、データを含む構造は次のようになります。

 {
      DATE_TIME  => "10/31/2031 12:00am",
      PARAMETERS => {
                       COLOR     => "red",
                       SIZE      => "Really big",
                       NAME      => "Herman",
                    }
 }

通常、値を含むフィールドを持つオブジェクトを考えます。SQL テーブルまたはスプレッドシートの行を考えてみてください。見出しのある列と、値を含む行があります。

従業員を取りましょう。名前、年齢、職業、電話番号があります。

{
      NAME  => "Bob Smith",
      AGE   => "None of your business",
      JOB   => "Making your life miserable",
      PHONE => "555-1212"
}

テーブルとは異なり、各エントリには他の構造を含めることができます。たとえば、通常、人々は複数の電話番号を持っており、名前とは別に姓を保存したい場合があります。

{
     NAME  => {
                   FIRST => "Bob",
                   LAST  => "Smith"
              }
     AGE   => "None of your business",
     JOB   => "Making your life miserable"
     PHONE =>  {
                   CELL => "555.1234",
                   WORK => "555.1212"
               }
}

次に、同時に複数の電話を持っている人がいます。たとえば、ボブは 2 台の携帯電話を持っています。この場合、各電話タイプ フィールドを値の配列にします。

{
     NAME  => {
                   FIRST => "Bob",
                   LAST  => "Smith",
              }
     AGE   => "None of your business",
     JOB   => "Making your life miserable"
     PHONE =>  {
                   CELL => ["555.1234", "555.4321"]
                   WORK => ["555.1212"]
               }
}

そしてそれを初期化するには:

my $person = {};
$person->{NAME}->{FIRST} = "Bob";
$person->{NAME}->{LAST}  = "Smith";
$person->{AGE} = "None of your business";
$person->{JOB} = "Making your life miserable";
$person->{PHONE}->{CELL}->[0] = "555.1234";
$person->{PHONE}->{CELL}->[1] = "555.4321";
$person->{PHONE}->{WORK}->[0] = ""555.1212";
于 2013-07-01T22:22:57.193 に答える
0

paramsキーがすべての名前で、値が実際の値であるハッシュを持つことが適切だと思います。それがあなたの望みのようです。

my %hash = {
  'datetime value' => {
    'category' => {
        'params' => {
            'param-name1' => 'param-value1',
            'param-name2' => 'param-value2',
            'param-name3' => 'param-value3',
            etc..
      }
    }
  }
}

この再構築の後、あなたが望むものに基づいてソートするのはかなり簡単になるはずです.

キーのアルファベット順:

my @alphabetic_keys = sort {  $hash{$a} cmp $hash{$b} } keys %{ $hash{params} };

キーごとの長さ:

my @by_length_keys = sort { length($a) <=> length($b) } keys %{ $hash{params} };
于 2013-07-01T20:19:28.457 に答える
0

カテゴリ名が一意であると仮定すると、次のデータ構造をお勧めします。

{
  'datetime value 1' => {
    'category name 1' => {
        'param name 1' = > [param value1, param value2, ...],
        'param name 2' = > [param value3, param value4, ...],
        etc...
    },
    'category name 2' => {
        'param...' => [ value... ]
  },
  'datetime value 2' => {
    etc...
  }
}
于 2013-07-01T21:26:08.873 に答える