我想要做的是根据设备IP组织一堆配置参数。
对于每个IP,都有一个索引列表($row
),我必须为该特定IP生成配置。
(这些索引是我在此上下文中的'数据'。不要将它们看作索引,它们是我必须放在那里然后在配置生成期间获取它们。)
我需要“分组”的数据可能看起来像这样......
$routerIP $row (an index to a global hash containing various details)
10.10.10.10 2
10.10.10.12 1
10.10.10.10 0
10.10.10.12 3
所以我想(并且我这样做,看看打印输出!)
$ipGroup{$10.10.10.10}[1] = 2
$ipGroup{$10.10.10.10}[2] = 0
$ipGroup{$10.10.10.12}[1] = 1
$ipGroup{$10.10.10.12}[2] = 3
我将%ipGroup
填入一个将遍历数据的循环:
my $routerIP = #code to get the ip
my $ind = $ipGroup{$routerIP}[0]+1;
$ipGroup{$routerIP}[0] = $ind;
$ipGroup{$routerIP}[$ind] = $row;
Quick and dirty在每个IP的数组的第0个元素中存储'当前索引'$ind
对于最新的$ind
,请填写当前的$row
。这种方式在$routerIP
键的数组中前进。
我如何在不同的子程序中读取组(%isGroup是全局的):
foreach $routerIP (keys %ipGroup) {
my @rows = @{$ipGroup{$routerIP}};
my $index = 0;
while ($rows[$index]) {
$index++;
my $row = $rows[$index];
# do stuff here
}
}
问题是:
虽然它针对每个路由器进行迭代,但它不会遍历所有@rows
对于散列中的最后一个路由器
因此,使用上面的数据,ID为10.10.10.10获取适当的配置,包含$row=2
和$row=0
的所有内容
但对于10.10.10.12 id只能获得$row=3
的配置?!
为了一个键而不是另一个键,它如何迭代所有行,为每个哈希键打印数组我看到它们是不同的,我不只是在两个$ hash值中引用了一个数组。 通过所有循环选项以及引用和解除引用数据结构初始化,我完全感到困惑。
填写时的代码(填写$row
时命名为$hashId
)
print "updated router: $routerIP index: $ind hashId: $hashId <br />";
updated router: 10.10.10.10 index: 1 hashId: 0
updated router: 10.10.10.10 index: 2 hashId: 1
updated router: 10.10.10.12 index: 1 hashId: 2
updated router: 10.10.10.12 index: 2 hashId: 3
updated router: 10.10.10.10 index: 3 hashId: 4
填写完成后的数据转储:
$VAR1 = {
'10.10.10.12' => [
2,
'2',
'3'
],
'10.10.10.10' => [
3,
'0',
'1',
'4'
]
};
在代码的内部while循环中:
print "in loop: $routerIP index: $index hashId: <br />";
in loop: 10.10.10.12 index: 1 hashId: 2
in loop: 10.10.10.12 index: 2 hashId: 3
in loop: 10.10.10.12 index: 3 hashId:
in loop: 10.10.10.10 index: 1 hashId: 0
我看到了差异,但我很茫然,花了几个小时。
答案 0 :(得分:2)
我想出了这个。它使用所有引用,非常干净。
#!/usr/bin/perl
use strict;
# Setup a reference to a HASH
my $ipGroup = {};
# Populate your structure with __DATA__
foreach my $item (<DATA>) {
$item =~ m/([0-9\.]+)\s(.*)/;
# Push the "row" onto an array dynamically
push @{$ipGroup->{$1}}, $2;
}
foreach my $routerIP ( keys %{$ipGroup} ) {
foreach my $row ( @{$ipGroup->{$routerIP}} ) {
print "Doing stuff to $routerIP with index [ $row ] \n";
}
}
我只是将您提供的数据直接放在文件中,您可能需要更改此内容。
__DATA__
10.10.10.10 2
10.10.10.12 1
10.10.10.10 0
10.10.10.12 3