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。