簡體   English   中英

Perl中存儲表格數據的最佳數據結構是什么?

[英]What is the best data structure in Perl to store tabular data?

我有一張包含以下數據的表格

1.1.1.1   routerA  texas
2.2.2.2   routerB  texas
3.3.3.3   routerC  california

Perl中存儲此數據的最佳數據結構是什么? 我正在考慮以IP地址作為密鑰存儲在散列哈希中

1.1.1.1 
 routerA => texas,
2.2.2.2
 routerB => texas,
3.3.3.3
 routerC => california

但是,如果我想獲得德州的所有IP地址,我的數據結構可能不夠靈活。 如果我關心德克薩斯州的所有IP地址,有沒有更好的存儲方式?

Pure Perl絕對能勝任這項任務。

將表視為一組記錄。 在Perl中,這是一個哈希引用數組。 (AoA有時可能適用,請記住TIMTOWTDI)

每個哈希引用的鍵對應於列/字段名稱,值將是該特定記錄的值。

將OP的示例轉換為數據結構:

my @data = (
             {
                ip     => '1.1.1.1',
                router => 'routerA',
                state  => 'texas',
             },
             {
                ip     => '2.2.2.2',
                router => 'routerB',
                state  => 'texas',
             },
             {
                ip     => '3.3.3.3',
                router => 'routerA',
                state  => 'california',
             }
           );

現在是有趣的部分:

# Give me all IPs in Texas

my @ips_in_texas = map $_->{ip},
                    grep { $_->{state} =~ /texas/i }
                     @data;

# How many states does the data cover?

use List::MoreUtils 'uniq';

my $states_covered = uniq( map $_->{state}, @data );

# How many unique IPs in each state?

my %ips_by_state;
$ips_by_state{ $_->{state} }{ $_->{ip} }++ for @data;
print "'$_': ", scalar keys %{ $ips_by_state{$_} }, "\n" for keys %ips_by_state;

當我建議這種數據結構圍繞着對記憶的渴望時,我常常得到的下意識反應。 坦率地說,除非你處理數百萬條記錄,否則它不會成為問題。 如果是這種情況,DBMS是您尋求的鉛筆銳化解決方案,而不是Perl。

我知道,它不是perl ......但是內存中的SQLite表怎么樣? 快速,靈活,便攜,甚至可持久。 你可以在那里做更多復雜的事情,然后尋找德克薩斯州的所有IP ......

您建議使用以IP地址為鍵的哈希散列,這正是我要做的。 但是,您還必須構建一個單獨的輔助交叉引用哈希,其中狀態(如Texas)是密鑰,IP地址是數據。 在二級哈希中,每個狀態都是一個鍵,相應的值本身就是一個哈希值。 在內部哈希中,鍵是IP,值是虛擬值,通常為值1。

在您的示例中,這是輔助交叉引用哈希:

california
 { 3.3.3.3 => 1 },
texas
 { 1.1.1.1 => 1, 2.2.2.2 => 1 }

您可以編寫一個簡短的子例程/函數/塊來構建主要的輔助哈希。 如果數據集很大經常更新會有點困難,但想法是一樣的。

如果您第一次掌握Perl幾乎太可愛但仍然相當方便的自動修復功能,您會發現編寫上述代碼更容易:請參閱manlages perlreftutperlref。

暫無
暫無

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

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