0

我有一个包含大量数据的大型一维散列,我需要以这样一种方式对其进行结构化,以便我可以轻松地将其排序为每次代码执行时都相同的格式。

原始哈希数据:

{
'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

看看你的第一个和第二个例子之间的区别,我认为你的结构有点偏离。我认为这更符合您的要求:

{
     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"
               }
}

然后我们有同时拥有多部手机的人。例如,鲍勃有两部手机。在这种情况下,我们将使每个电话类型字段成为一个值数组:

{
     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 回答