- 论坛徽章:
- 7
|
本帖最后由 rubyish 于 2014-03-05 01:12 编辑
biru:- #!/usr/bin/perl
- use Data::Dumper;
- $Data::Dumper::Terse = 1;
- $Data::Dumper::Sortkeys = 1;
- $Data::Dumper::Pair = ': ';
- my $tree;
- while (<DATA>) {
- chomp;
- my ( $ances, @post ) = split /\s+->\s+/;
- $tree->{$ances}{ $post[0] } ||= {};
- my $f = $tree->{$ances};
- for my $i ( 0 .. $#post - 1 ) {
- $f->{ $post[$i] }{ $post[ $i + 1 ] } ||= {};
- $f = $f->{ $post[$i] };
- }
- }
- sub from {
- my $h = shift;
- my @h = map { $_, $h->{$_} } sort keys %$h;
- map {
- my ( $k, $v ) = splice @h, 0, 2;
- { Name => $k, %$v ? ( child => [ from($v) ] ) : () }
- } 1 .. @h / 2;
- }
- my @data = from $tree;
- print Dumper \@data;
- __DATA__
- YXDL.A -> YXDL.B.1
- YXDL.A -> YXDL.B.1 -> YXDL.B.1.1
- YXDL.A -> YXDL.B.2
- YXDL.A -> YXDL.B.2 -> YXDL.B.2.1
- YXDL.A -> YXDL.B.2 -> YXDL.B.2.1 -> YXDL.B.2.1.1
- YXDL.A -> YXDL.B.2 -> YXDL.B.2.2
- YXDL.A -> YXDL.B.2 -> YXDL.B.2.2 -> YXDL.B.2.2.1
- YXDL.A -> YXDL.B.2 -> YXDL.B.2.2 -> YXDL.B.2.2.2
- YXDL.A -> YXDL.B.2 -> YXDL.B.2.3
- YXDL.A -> YXDL.B.2 -> YXDL.B.2.3 -> YXDL.B.2.3.1
- YXDL.A -> YXDL.B.2 -> YXDL.B.2.4
- YXDL.A -> YXDL.B.2 -> YXDL.B.2.5
- YXDL.A -> YXDL.B.2 -> YXDL.B.2.5 -> YXDL.B.2.5.1
- YXDL.A -> YXDL.B.3
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.1
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.1 -> YXDL.B.3.1.1
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.1 -> YXDL.B.3.1.1 -> YXDL.B.3.1.1.1
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.1 -> YXDL.B.3.1.2
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.1 -> YXDL.B.3.1.2 -> YXDL.B.3.1.2.1
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.1 -> YXDL.B.3.1.3
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.2
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.2 -> YXDL.B.3.2.1
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.3
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.1
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.1 -> YXDL.B.3.3.1.1
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.2
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.2 -> YXDL.B.3.3.2.1
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.2 -> YXDL.B.3.3.2.2
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.3
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.3 -> YXDL.B.3.3.3.1
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.4
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.5
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.5 -> YXDL.B.3.3.5.1
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.4
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.5
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.6
- YXDL.A -> YXDL.B.4
- YXDL.A -> YXDL.B.5
- YXDL.A -> YXDL.B.6
复制代码 ~
v2: ~- #!/usr/bin/perl
- use Data::Dumper;
- $Data::Dumper::Terse = 1;
- $Data::Dumper::Sortkeys = 1;
- $Data::Dumper::Pair = ': ';
- my $tree;
- while (<DATA>) {
- chomp;
- my @p = split /\s+->\s+/;
- my $p = $tree->{ shift @p } ||= {};
- $p = $p->{$_} ||= {} for @p;
- }
- sub from {
- my $p = shift;
- map {
- my ( $n, $c ) = @$_;
- { Name => $n, %$c ? ( children => [ from($c) ] ) : () }
- } map { [ $_, $p->{$_} ] } sort keys %$p;
- }
- my @data = from $tree;
- print Dumper \@data;
- __DATA__
- YXDL.A -> YXDL.B.1
- YXDL.A -> YXDL.B.1 -> YXDL.B.1.1
- YXDL.A -> YXDL.B.2
- YXDL.A -> YXDL.B.2 -> YXDL.B.2.1
- YXDL.A -> YXDL.B.2 -> YXDL.B.2.1 -> YXDL.B.2.1.1
- YXDL.A -> YXDL.B.2 -> YXDL.B.2.2
- YXDL.A -> YXDL.B.2 -> YXDL.B.2.2 -> YXDL.B.2.2.1
- YXDL.A -> YXDL.B.2 -> YXDL.B.2.2 -> YXDL.B.2.2.2
- YXDL.A -> YXDL.B.2 -> YXDL.B.2.3
- YXDL.A -> YXDL.B.2 -> YXDL.B.2.3 -> YXDL.B.2.3.1
- YXDL.A -> YXDL.B.2 -> YXDL.B.2.4
- YXDL.A -> YXDL.B.2 -> YXDL.B.2.5
- YXDL.A -> YXDL.B.2 -> YXDL.B.2.5 -> YXDL.B.2.5.1
- YXDL.A -> YXDL.B.3
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.1
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.1 -> YXDL.B.3.1.1
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.1 -> YXDL.B.3.1.1 -> YXDL.B.3.1.1.1
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.1 -> YXDL.B.3.1.2
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.1 -> YXDL.B.3.1.2 -> YXDL.B.3.1.2.1
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.1 -> YXDL.B.3.1.3
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.2
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.2 -> YXDL.B.3.2.1
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.3
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.1
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.1 -> YXDL.B.3.3.1.1
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.2
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.2 -> YXDL.B.3.3.2.1
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.2 -> YXDL.B.3.3.2.2
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.3
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.3 -> YXDL.B.3.3.3.1
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.4
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.5
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.5 -> YXDL.B.3.3.5.1
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.4
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.5
- YXDL.A -> YXDL.B.3 -> YXDL.B.3.6
- YXDL.A -> YXDL.B.4
- YXDL.A -> YXDL.B.5
- YXDL.A -> YXDL.B.6
复制代码 Dumper:- [
- {
- 'Name': 'YXDL.A',
- 'child': [
- {
- 'Name': 'YXDL.B.1',
- 'child': [
- {
- 'Name': 'YXDL.B.1.1'
- }
- ]
- },
- {
- 'Name': 'YXDL.B.2',
- 'child': [
- {
- 'Name': 'YXDL.B.2.1',
- 'child': [
- {
- 'Name': 'YXDL.B.2.1.1'
- }
- ]
- },
- {
- 'Name': 'YXDL.B.2.2',
- 'child': [
- {
- 'Name': 'YXDL.B.2.2.1'
- },
- {
- 'Name': 'YXDL.B.2.2.2'
- }
- ]
- },
- {
- 'Name': 'YXDL.B.2.3',
- 'child': [
- {
- 'Name': 'YXDL.B.2.3.1'
- }
- ]
- },
- {
- 'Name': 'YXDL.B.2.4'
- },
- {
- 'Name': 'YXDL.B.2.5',
- 'child': [
- {
- 'Name': 'YXDL.B.2.5.1'
- }
- ]
- }
- ]
- },
- {
- 'Name': 'YXDL.B.3',
- 'child': [
- {
- 'Name': 'YXDL.B.3.1',
- 'child': [
- {
- 'Name': 'YXDL.B.3.1.1',
- 'child': [
- {
- 'Name': 'YXDL.B.3.1.1.1'
- }
- ]
- },
- {
- 'Name': 'YXDL.B.3.1.2',
- 'child': [
- {
- 'Name': 'YXDL.B.3.1.2.1'
- }
- ]
- },
- {
- 'Name': 'YXDL.B.3.1.3'
- }
- ]
- },
- {
- 'Name': 'YXDL.B.3.2',
- 'child': [
- {
- 'Name': 'YXDL.B.3.2.1'
- }
- ]
- },
- {
- 'Name': 'YXDL.B.3.3',
- 'child': [
- {
- 'Name': 'YXDL.B.3.3.1',
- 'child': [
- {
- 'Name': 'YXDL.B.3.3.1.1'
- }
- ]
- },
- {
- 'Name': 'YXDL.B.3.3.2',
- 'child': [
- {
- 'Name': 'YXDL.B.3.3.2.1'
- },
- {
- 'Name': 'YXDL.B.3.3.2.2'
- }
- ]
- },
- {
- 'Name': 'YXDL.B.3.3.3',
- 'child': [
- {
- 'Name': 'YXDL.B.3.3.3.1'
- }
- ]
- },
- {
- 'Name': 'YXDL.B.3.3.4'
- },
- {
- 'Name': 'YXDL.B.3.3.5',
- 'child': [
- {
- 'Name': 'YXDL.B.3.3.5.1'
- }
- ]
- }
- ]
- },
- {
- 'Name': 'YXDL.B.3.4'
- },
- {
- 'Name': 'YXDL.B.3.5'
- },
- {
- 'Name': 'YXDL.B.3.6'
- }
- ]
- },
- {
- 'Name': 'YXDL.B.4'
- },
- {
- 'Name': 'YXDL.B.5'
- },
- {
- 'Name': 'YXDL.B.6'
- }
- ]
- }
- ]
复制代码 |
|