在Perl中填充和迭代数组的哈希

时间:2012-03-22 13:39:05

标签: perl data-structures reference

我想要做的是根据设备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时命名为$hashIdprint "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 

我看到了差异,但我很茫然,花了几个小时。

1 个答案:

答案 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