【问题标题】:Perl - "Complex" Data StructurePerl - “复杂”数据结构
【发布时间】:2017-11-13 23:25:57
【问题描述】:

我正在尝试获得一个可行的数据结构,我可以以一种合理的方式从中提取元素值。一旦数据进入结构,就很难处理数据。这就是结构的构建方式:

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";}

}

产生这种结构:

%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}

虽然理想情况下结构应该是这样的,但尝试在子 identifyNode 提取数据时我更不高兴:

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

然后以我正在使用的另一种方法返回数据:

 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++;
    }

}

然后生成:

$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

因此对于 $h 中的每个散列,只有最顶层的主机被评估并返回主机名。这是因为行中的 [0] 告诉它这样做:

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

我曾尝试过不同的数据结构并以多种方式取消引用该结构,这是我发现的唯一中途之家...

(IP 已被混淆,因此在我的示例中不一致)

【问题讨论】:

  • print Dumper(\%master)
  • 我不确定到底是什么问题,但对于一个问题,您需要在每个级别取消引用(并迭代)。所以用for my $e (@{$hops{$h}}) { my %host = %{ $hops{$h}[$e] } .. }代替%{ $hops{$h}[0] }(如果我的嵌套正确的话)。更重要的是,当复杂的结构变得过于笨重时,建议改为编写一个类。
  • 每当我看到“复杂的数据结构”时,我都会想“试着把它写成 OO”。因为这几乎就是面向对象的
  • 谢谢 Zdim 我会试试你的方法,虽然我认为这是我尝试过的东西..我的语法可能有点不对劲!
  • 是的,Sobrique 将其更改为 OO 已完成,但是一旦定义了跃点对象,我就会遇到相同的问题,即遍历该跃点下包含的每个 IP 和 FREQ。我需要在这里应用一种设计模式,但它正在逃避我的脑海..

标签: perl data-structures


【解决方案1】:

感谢您的建议,它让我成功了一半。它现在可以工作了(仍然有点令人费解!):

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);
}

我是否有足够的勇气将数据作为哈希添加到@fin_nodes.. 嗯

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-24
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    相关资源
    最近更新 更多