2017-11-09 23 views
0

私は実用的なデータ構造を得ようとしており、要素値を賢明な方法で引き出すことができます。一度その構造でデータを扱うのは非常に困難です。これは、構造体を構築する方法を示します。Perl - "Complex"データ構造

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

}

この構造体の製造:マスターが含まれてい

%:

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

に理想的な構造は次のようになりますが、私が持っていましたサブ識別ノードでデータを引き出そうとするほうが喜びです。

そして、私が使用している他の方法に戻ってデータを取得するために10

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にのみ最上位のホストが評価されますhostnameが返されました。

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

私は異なるデータ構造の周りプレイしたと構造を参照解除多くの方法を、これが唯一の途中の家である:[0]ラインにでそうするように言われているからですそれは中途半端そこに私を得た

(IPはそう難読化されていますが、私の例では一貫していない)...あなたのアドバイスを

+2

'印刷ダンパ(\%のマスターを)' – mob

+1

問題の内容が正確かはわかりませんが、すべてのレベルで逆参照(および繰り返し)する必要があります。それで、私の$ e(@ {$ hops {$ h}})のために '%{$ hops {$ h} [0]}'の代わりに{my%host =%{$ hops {$ h} [$ e ]} ..} '(もし私があなたの入れ子の権利を得たら)。複雑な構造があまりにも扱いにくくなったら、代わりにクラスを書くヒントです。 – zdim

+0

私は '複雑なデータ構造'を見るたびに、 'OOとして書くこと'を考えます。それはOOが何であるのかとほとんど同じです。 – Sobrique

答えて

0

おかげで、私を見つけました。それは(まだ多少複雑な方法で!)動作するようになりました:

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にハッシュとしてデータを追加するのに十分な私は勇敢アム...うーん