我有一个包含以下字段的数据集。
主机名、型号、位置、端口号、激活?、启动?
我会将它们转换成散列结构(可能类似于下面)。
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,
},
},
);最后,我想生成这样的统计信息: No。每栋建筑的交换机数量,第每栋楼每种型号的交换机总数每栋建筑的up端口数量
统计数据可能不仅限于建筑智慧,甚至可以是基于交换机的(即,否。开关的95%的使用率等)。使用给定的数据结构,我如何枚举这些计数器?
相反,有没有更好的方法来存储我的数据?我至少能想到一种格式:
<while iterating over records>
{
hash{$location}->{$model_name}->count++;
if ($State eq 'Active') {hash{$location}->{up_ports}->count++};做这件事最好的方法是什么?如果我选择第一种格式(其中所有信息都在散列中保持不变),我如何混搭数据以生成不同的统计数据?(一些示例代码片段将非常有帮助!)
发布于 2011-04-17 21:28:16
如果你想要查询的灵活性,“数据库”策略通常是好的。您可以直接这样做,只需将数据放入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的答案,这与你的问题有一些相似之处。
发布于 2011-04-17 19:42:22
据我所知,您有一个元组列表,为了便于讨论,考虑具有2个属性的对象就足够了,例如location和ports_used。所以,举个例子:
(["locA", 23], ["locB", 42], ["locA", 13]) # just the values as tuples, no keys你想要一个如下的结果:
("locA" => 36, "locB" => 42)这是正确的吗?如果是这样,您面临的问题是什么?
https://stackoverflow.com/questions/5693073
复制相似问题