簡體   English   中英

使用Perl構建和訪問復雜的數據結構

[英]Build and Access a Complex Data Structure Using Perl

我有一個包含大量數據的大型一維哈希,我需要以這樣的方式構造,以便我可以輕松地將其排序為每次代碼執行時都相同的格式。

原始哈希數據:

{
'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,以便輸出中的順序始終相同。

看看你的第一個和第二個例子之間的區別,我認為你的結構有點偏。 我認為這符合你想要的更多:

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

然后我們有同時擁有多部手機的人。 例如,Bob有兩部手機。 在這種情況下,我們將為每個電話類型字段設置一個值數組:

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

我認為有一個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} };

假設類別名稱是唯一的,我建議使用以下數據結構:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM