2012-12-17 2 views
1

내 perl 스크립트에서 필자의 네트워크에서 시스코 라우터 (이 경우 장치의 IP 주소)를 통해 CDP 네이버 정보를 수집하여 2 차원 해시를 채웠습니다. 해시를 사용하면 복제본을 제한하고 부모 딸 관계를 캡처 할 수 있습니다.시스코 cdp 토폴로지에 대한 d3 dendrogram

$name{$hostIP}{$neighbourIP} = $name; 

나는 반복적으로 같은 JSON 포맷 데이터 라우터 토폴로지 또는 연결 관계를 설명하고 필요 (A dendrogram은에) D3.js로 해시 데이터를 사용하고 싶습니다 :

{ 
name: "10.120.5.1", 
children: [ 
    { 
    name: "10.120.5.2", 
    children: [ 
    { 
    name: "10.120.5.3", 
    children: [ 
     { 
     name: "10.120.5.4" 
     }, 
     { 
     name: "10.120.6.1" 
     }, 
     { 
     name: "10.120.6.2" 
     }, 
     { 
     name: "10.120.6.3" 
     } 
    ] 
    } 
    ] 
    } 
] 
} 

을 누군가가 위와 비슷한 JSON으로 해시 형식을 변환하는 방법을 보여주는 라이브러리 또는 일반 print 문을 사용하여 예제를 제공 할 수 있습니까? Perl이 선호되지만 python, C와 같은 모든 언어가 도움이 될 것입니다. 또한이 작업을 이미 수행하고있는 오픈 소스 스크립팅을 아는 사람이라면 비교하고 싶을 것입니다.

+2

검색하셨습니까? 사용자의 요구에 맞는 [JSON] (http://search.cpan.org/perldoc?JSON)이라는 모듈이 있습니다. – TLP

답변

1

는 재귀이 도움이됩니까? 당신과 같은 해시에서 시작, 나는 아이들이 나열 할 수있는 볼

  • 너비 우선 검색을 수행하는 부모가 중간 구조의 깊이 우선 연습 다음
  • , 해시 구축 json 샘플
  • 에 이어 json으로 직접 덤프하십시오.

데이터를 두 번 걷는 것이 차선책으로 보이지만 그렇게하지 않으면 매우 깊은 맹장염 증상이 나타납니다.

#!/bin/perl 

use 5.010; # Enable 'say'. Sorry, old perl 
use strict; 
use warnings; 
use JSON::PP; # Just 'use JSON;' on most systems 

# 0. set up some data in adjacency table 
my %name; 
$name{'10.120.5.1'}{'10.120.5.2'}++; 
$name{'10.120.5.2'}{'10.120.5.1'}++; 

$name{'10.120.5.2'}{'10.120.5.3'}++; 
$name{'10.120.5.3'}{'10.120.5.2'}++; 

$name{'10.120.5.3'}{'10.120.5.4'}++; 
$name{'10.120.5.4'}{'10.120.5.3'}++; 

$name{'10.120.5.3'}{'10.120.6.1'}++; 
$name{'10.120.6.1'}{'10.120.5.3'}++; 

$name{'10.120.5.3'}{'10.120.6.2'}++; 
$name{'10.120.6.2'}{'10.120.5.3'}++; 

$name{'10.120.5.3'}{'10.120.6.3'}++; 
$name{'10.120.6.3'}{'10.120.5.3'}++; 


# 1. set up helper structures 
# pick a starting point 
(my $root) = keys %name; 

# empty structures 
my %nodes =(); 
my %tree =(); 
my @queue = ($root); 

# 2. First pass: BFS to determine child nodes 
list_children(\%name, \@queue, \%nodes) while @queue; 

# 3. Second pass: DFS to set up tree 
my $tree = build_tree($root, \%nodes); 

# 4. And use JSON to dump that data structure 
my $json = JSON::PP->new->pretty; # prettify for human consumption 

say $json->encode($tree); 

sub list_children { 
    my $adjac = shift; 
    my $queue = shift; 
    my $nodes = shift; 

    my $node = shift @$queue; 

    # all child nodes 
    my @children = keys %{$adjac->{$node}}; 

    # except the ones we visited earlier, to avoid loops 
    @children = grep { ! exists $nodes->{$_}} @children; 

    $nodes->{$node} = \@children; 

    # and toss on the queue 
    push @$queue, @children; 
} 

sub build_tree { 
    my $root = shift; 
    my $nodes = shift; 

    my @children; 
    for my $child (@{$nodes->{$root}}) { 
    push @children, build_tree($child, $nodes); 
    } 

    my %h = ('name'  => $root, 
      'children' => \@children); 

    return \%h; 
} 
+0

감사합니다 이것은 절대적으로 완벽합니다. 그것은 저에게 많은 것을 가르치며 코드는 매우 분리되어 있습니다. JSON 출력은 D3에서 즉시로드됩니다. – coderabbit

1

JSON 모듈을 사용하십시오.

https://metacpan.org/pod/JSON

사용 JSON;

my $ json = JSON-> new();

내 $ json_string = $ json-> 인코딩 ($ hash_to_send_to_d3)

+0

감사하지만 임 깊은 재귀를 수행하는 방법에 더 관심이. 임이 루프를 시도하는 것을 잊어 버렸습니다. 위에서 JSON 라이브러리를 사용하는 방법을 설명 할 수 있습니까? – coderabbit

+0

무슨 뜻인지 모르겠다. 위에서 해시 한 해시를 $ json-> encode()에 전달하면 해당 데이터 구조의 jsonified 버전이 반환됩니다. 글쎄 그건 맞지 않아. 이미 json으로 보이는 구조가 아니라 해당 데이터 구조의 Perl 버전을 전달해야합니다. – jmcneirney