![](/img/trans.png)
[英]What's the best way to make a deep copy of a data structure in 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 perlreftut和perlref。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.