我有一个包含以下字段的数据集。
主机名,型号,位置,端口号,已激活?,向上?
我会将它们转换为哈希结构(可能类似于下面的)
my %switches = (
a => {
"hostname" => "SwitchA",
"model" => "3750",
"location" => "Building A"
"total_ports" => 48,
"configured_ports" => 30,
"used_ports" => 24,
},
b => {
"hostname" => "SwitchB",
"model" => "3560",
"location" => "Building B"
"total_ports" => 48,
"configured_ports" => 36,
"used_ports" => 20,
},
},
);
最后我想生成统计数据,例如: 每栋建筑的开关数量, 每栋建筑的每个型号的开关数量 总数没有。每个建筑物的港口数量
统计数据可能不仅仅局限于建筑物,甚至可能基于开关(即,95%使用的开关等等)。使用给定的数据结构,我如何枚举这些计数器?
相反,有没有更好的方法来存储我的数据?我能想到至少一种格式:
<while iterating over records>
{
hash{$location}->{$model_name}->count++;
if ($State eq 'Active') {hash{$location}->{up_ports}->count++};
最好的方法是什么?如果我选择第一种格式(哈希中所有信息都完好无损),我如何将数据混合以产生不同的统计数据? (一些示例代码片段会有很大的帮助!)
答案 0 :(得分:2)
如果您想要查询灵活性,“数据库”策略通常是好的。您可以通过将数据放入SQLite之类的内容来直接执行此操作。根据这种方法,您可以针对数据发出各种各样的查询,而无需编写自己的编码。
或者,如果您正在寻找一种纯粹的Perl方法,那么近似数据库表的方法是使用数组数组,或者更好的代码可读性,即散列数组。外部数组类似于数据库表。该数组中的每个哈希都像一个数据库记录。您的基于Perl的查询最终会如下所示:
my @query_result = grep {
$_->{foo} == 1234 and
$_->{bar} eq 'fubb'
} @data;
如果您有很多行,查询性能成为瓶颈,您可以使用哈希创建自己的索引。
%data_by_switch = (
'SwitchA' => [0, 4, 13, ...], # Subscripts to @data.
'SwitchB' => [1, 12, ...],
...
);
我的回答是根据我收到的this question的答案,与您的问题有一些相似之处。
答案 1 :(得分:1)
据我所知,你有一个元组列表,为了讨论起见,考虑具有2个属性的对象就足够了,例如location和ports_used。所以,例如:
(["locA", 23], ["locB", 42], ["locA", 13]) # just the values as tuples, no keys
你想得到一个结果:
("locA" => 36, "locB" => 42)
这是对的吗?如果是这样,你面临的问题是什么?