Perl中存储表格数据的最佳数据结构是什么?

use*_*021 3 perl perl-data-structures

我有一张包含以下数据的表格

1.1.1.1   routerA  texas
2.2.2.2   routerB  texas
3.3.3.3   routerC  california
Run Code Online (Sandbox Code Playgroud)

Perl中存储此数据的最佳数据结构是什么?我正在考虑以IP地址作为密钥存储在散列哈希中

1.1.1.1 
 routerA => texas,
2.2.2.2
 routerB => texas,
3.3.3.3
 routerC => california
Run Code Online (Sandbox Code Playgroud)

但是,如果我想获得德州的所有IP地址,我的数据结构可能不够灵活.如果我关心德克萨斯州的所有IP地址,有没有更好的存储方式?

Zai*_*aid 10

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',
             }
           );
Run Code Online (Sandbox Code Playgroud)

现在是有趣的部分:

# 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;
Run Code Online (Sandbox Code Playgroud)

当我建议这种数据结构以其对记忆的渴望为中心时,我经常得到的下意识反应.坦率地说,除非你处理数百万条记录,否则它不会成为问题.如果是这种情况,DBMS是您寻求的铅笔锐化解决方案,而不是Perl.