使用Perl构建和访问复杂的数据结构
我有一个包含大量数据的大型一维散列,我需要以这样一种方式对其进行结构,以便我可以轻松地将其排序为每次代码执行时都相同的格式 原始散列数据:使用Perl构建和访问复杂的数据结构,perl,perl-data-structures,Perl,Perl Data Structures,我有一个包含大量数据的大型一维散列,我需要以这样一种方式对其进行结构,以便我可以轻松地将其排序为每次代码执行时都相同的格式 原始散列数据: { 'datetime' => 'datetime value', 'param_name' => 'param name', 'param_value' => 'param value', 'category' => 'category name' } 当前数据结构: { 'datetime value' => {
{
'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
}
}
}
我几乎可以在代码中构建这个结构,除了每个类别之外,可能有多个参数名和具有相同键名的参数值
我遇到的问题是,如果有多个参数名/值,则只有最后一对保存在新的数据结构中
我知道密钥必须是唯一的,所以我还不确定如何解决这个问题
构建结构后,我需要了解如何根据datetime、param_name对数据进行排序,以便输出中的顺序始终相同。我认为使用
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} };
my@by_length_keys=sort{length($a)length($b)}keys%{$hash{params};
假设类别名称是唯一的,我建议使用以下数据结构:
{
'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...
}
}
看看你的第一个和第二个例子之间的区别,我认为你的结构有点偏离。我认为这更符合您的需求:
{
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";
一些问题:第二个数据结构中的
类别名称在哪里?参数名称/值对的顺序是否重要?如果有多个同名参数,能否将它们存储为一个键(名称)和一个值列表?类别名称是否不同?