简体   繁体   English

Perl-“复杂”数据结构

[英]Perl - “Complex” Data Structure

I'm trying to get a workable data structure that I can pull the element values from in a sensible fashion. 我试图获得一个可行的数据结构,以一种明智的方式从中获取元素值。 Just having great difficulty working with the data once its in the structure. 一旦在结构中处理数据就很难了。 This is how the struct is built: 这是结构的构建方式:

sub hopCompare
{

    my %count;
    my %master;
    my $index = 0;

    foreach my $objPath (@latest)    #get Path object out of master array
    {
            my @path = @{$objPath->_getHopList()}; #dereferencing
            my $iter = 0;
            foreach my $hop (@path)
            {

                    ++$count{$hop}->{FREQ};
                    $count{$hop}->{INDEX} = $index;
                    $count{$hop}->{NODE} = $hop;

                    $index++;

            }
            $index = 0;
    }
    foreach my $element( keys %count )
    {
            if (defined($count{$element}->{NODE}))
            {
                    my $curr = $count{$element}->{INDEX};
                    my $freq = $count{$element}->{FREQ};
                    if (($freq > 1) || ($count{$element}->{INDEX} =~ /[0-1]/))
                    {
                            push @{ $master{$curr} }, {$count{$element}->{NODE}, {FREQ => $count{$element}->{FREQ}}};
                    }
                    print "$element = $count{$element}\n";
                    print "$element Index = $count{$element}->{INDEX}\n";
            }
    }
    print "\n Master contains: \n" . Dumper (%master);
    if (%master){return %master;} else {die "NO FINAL HOPS MATCHED";}

} }

Producing this structure: 产生这种结构:

%Master contains: %Master包含:

$VAR1 = '4';
$VAR2 = [
      {
        '1.1.1.2' => {
                              'FREQ' => 2
                            }
      }
    ];
$VAR3 = '1';
$VAR4 = [
      {
        '1.1.1.9' => {
                              'FREQ' => 5
                            }
      },
      {
        '1.1.1.8' => {
                              'FREQ' => 1
                            }
      }
    ];

    {truncated}

Although ideally the structure should look like this but I had even less joy trying to pull data out at sub identifyNode: 虽然理想情况下该结构应如下所示,但是尝试在子identifyNode上提取数据时,我的喜悦甚至更少:

$VAR1 = {
      '1' => [
               {
                 '1.1.1.9' => {
                                       'FREQ' => 5
                                     }
               },
               {
                 '1.1.5.8' => {
                                       'FREQ' => 1
                                     }
               }
             ],

Then to get back at the data in another method I'm using: 然后使用另一种方法来获取数据:

 sub identifyNode
 {
    my %hops = %{$_[0]};
    my $i = 0;

    foreach my $h ( keys %hops )                   #The HOP-INDEX is the key
    {
            print "\n\$h looks like \n" . Dumper ($hops{$h});
            my %host = %{ $hops{$h}[0] };           #Push the first HASH in INDEX to the %host HASH
            foreach my $hip (keys %host)
            {
                            my $corelink = `corelinks $hip`;

                            my ($node) = $corelink =~ /([a-z0-9-]+),[a-z0-9-\/]+,$hip/s;
                            print "\n\t\t\tHostname is $node\n";
            }
            $i++;
    }

}

This then generates: 然后生成:

$h looks like
$VAR1 = [
      {
        '1.1.1.2' => {
                              'FREQ' => 2
                            }
      }
    ];

                    Hostname is blabla-bla-a1

$h looks like
$VAR1 = [
      {
        '1.1.1.9' => {
                              'FREQ' => 5
                            }
      },
      {
        '1.1.1.8' => {
                              'FREQ' => 1
                            }
      }
    ];

                    Hostname is somew-some-a1

So for each hash in $h only the topmost host gets evaluated and hostname returned. 因此,对于$ h中的每个哈希,只会评估最顶层的主机,并返回主机名。 This is because it is told to do so by the [0] in line: 这是因为第[0]行告知这样做:

my %host = %{ $hops{$h}[0] };

I've played around with different data structures and de-referencing the structure a multitude of ways and this is the only halfway house I've found... 我研究了不同的数据结构,并以多种方式取消引用该结构,这是我发现的唯一中途之家...

(The IPs have been obfuscated so are not consistent in my examples) (IP已被混淆,因此在我的示例中不一致)

Thanks for your advice it got me halfway there. 感谢您的建议,这使我半途而废。 It works now (in still somewhat a convoluted fashion!) : 现在它可以工作了(仍然有些复杂!):

sub identifyNode
{
    my %hops = %{$_[0]};
    my $i = 0;
    my @fin_nodes;
    my $hindex;

    foreach my $h ( keys %hops )                   #The HOP-INDEX is the key
    {
            $hindex = $h;

            foreach my $e (@{$hops{$h}})       #first part of solution credit Zdim
            {
                    my @host = %{ $e };      #second part of solution
                    my $hip = $host[0];
                    my $corelink = `corelinks $hip`;
                    my ($node) = $corelink =~ /([a-z0-9-]+),[a-z0-9-\/]+,$hip/s;
                    print "\n\t\t\tHostname is $node\n";

                    push (@fin_nodes, [$node, $hindex, $e->{$hip}->{FREQ}]);
            }
            $i++;
    }
    return (\@fin_nodes);
}

Am I brave enough to add the data as a hash to @fin_nodes.. hmm 我足够勇敢地将数据作为哈希添加到@fin_nodes .. hmm

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM