免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4223 | 回复: 6
打印 上一主题 下一主题

请问如何由简单关系的源数据组成需要的数据结构 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-02-26 19:56 |只看该作者 |倒序浏览
20可用积分
本帖最后由 huhuegg 于 2014-02-26 19:56 编辑

请问如何由简单关系的源数据组成这样的数据结构

{
"name": "YXDL.A",
"children": [
                  { "name": "YXDL.B.1"
                     "children": [
                                      { "name": "YXDL.B.1.1"}
                                    ]
                  }
.....................



源数据
$VAR1 = {
          'YXDL.B.3.2' => [
                            'YXDL.B.3.2.1'
                          ],
          'YXDL.B.3.1' => [
                            'YXDL.B.3.1.1',
                            'YXDL.B.3.1.2',
                            'YXDL.B.3.1.3'
                          ],
          'YXDL.B.2.2' => [
                            'YXDL.B.2.2.1',
                            'YXDL.B.2.2.2'
                          ],
          'YXDL.B.3' => [
                          'YXDL.B.3.1',
                          'YXDL.B.3.2',
                          'YXDL.B.3.3',
                          'YXDL.B.3.4',
                          'YXDL.B.3.5',
                          'YXDL.B.3.6'
                        ],
          'YXDL.B.3.3.5' => [
                              'YXDL.B.3.3.5.1'
                            ],
          'YXDL.B.2.5' => [
                            'YXDL.B.2.5.1'
                          ],
          'YXDL.B.3.3' => [
                            'YXDL.B.3.3.1',
                            'YXDL.B.3.3.2',
                            'YXDL.B.3.3.3',
                            'YXDL.B.3.3.4',
                            'YXDL.B.3.3.5'
                          ],
          'YXDL.B.3.1.1' => [
                              'YXDL.B.3.1.1.1'
                            ],
          'YXDL.B.1' => [
                          'YXDL.B.1.1'
                        ],
          'YXDL.B.3.3.1' => [
                              'YXDL.B.3.3.1.1'
                            ],
          'YXDL.B.3.1.2' => [
                              'YXDL.B.3.1.2.1'
                            ],
          'YXDL.B.3.3.2' => [
                              'YXDL.B.3.3.2.1',
                              'YXDL.B.3.3.2.2'
                            ],
          'YXDL.B.2.1' => [
                            'YXDL.B.2.1.1'
                          ],
          'YXDL.A' => [
                        'YXDL.B.1',
                        'YXDL.B.2',
                        'YXDL.B.3',
                        'YXDL.B.4',
                        'YXDL.B.5',
                        'YXDL.B.6'
                      ],
          'YXDL.B.3.3.3' => [
                              'YXDL.B.3.3.3.1'
                            ],
          'YXDL.B.2.3' => [
                            'YXDL.B.2.3.1'
                          ],
          'YXDL.B.2' => [
                          'YXDL.B.2.1',
                          'YXDL.B.2.2',
                          'YXDL.B.2.3',
                          'YXDL.B.2.4',
                          'YXDL.B.2.5'
                        ]
        };

数据是以YXDL.A为根的
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

最佳答案

查看完整内容

biru:~v2: ~Dumper:

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
2 [报告]
发表于 2014-02-26 19:56 |只看该作者
本帖最后由 rubyish 于 2014-03-05 01:12 编辑

biru:
  1. #!/usr/bin/perl

  2. use Data::Dumper;
  3. $Data::Dumper::Terse    = 1;
  4. $Data::Dumper::Sortkeys = 1;
  5. $Data::Dumper::Pair     = ': ';

  6. my $tree;

  7. while (<DATA>) {
  8.     chomp;
  9.     my ( $ances, @post ) = split /\s+->\s+/;
  10.     $tree->{$ances}{ $post[0] } ||= {};
  11.     my $f = $tree->{$ances};
  12.     for my $i ( 0 .. $#post - 1 ) {
  13.         $f->{ $post[$i] }{ $post[ $i + 1 ] } ||= {};
  14.         $f = $f->{ $post[$i] };
  15.     }
  16. }

  17. sub from {
  18.     my $h = shift;
  19.     my @h = map { $_, $h->{$_} } sort keys %$h;
  20.     map {
  21.         my ( $k, $v ) = splice @h, 0, 2;
  22.         { Name => $k, %$v ? ( child => [ from($v) ] ) : () }
  23.     } 1 .. @h / 2;
  24. }

  25. my @data = from $tree;
  26. print Dumper \@data;

  27. __DATA__
  28. YXDL.A -> YXDL.B.1
  29. YXDL.A -> YXDL.B.1 -> YXDL.B.1.1
  30. YXDL.A -> YXDL.B.2
  31. YXDL.A -> YXDL.B.2 -> YXDL.B.2.1
  32. YXDL.A -> YXDL.B.2 -> YXDL.B.2.1 -> YXDL.B.2.1.1
  33. YXDL.A -> YXDL.B.2 -> YXDL.B.2.2
  34. YXDL.A -> YXDL.B.2 -> YXDL.B.2.2 -> YXDL.B.2.2.1
  35. YXDL.A -> YXDL.B.2 -> YXDL.B.2.2 -> YXDL.B.2.2.2
  36. YXDL.A -> YXDL.B.2 -> YXDL.B.2.3
  37. YXDL.A -> YXDL.B.2 -> YXDL.B.2.3 -> YXDL.B.2.3.1
  38. YXDL.A -> YXDL.B.2 -> YXDL.B.2.4
  39. YXDL.A -> YXDL.B.2 -> YXDL.B.2.5
  40. YXDL.A -> YXDL.B.2 -> YXDL.B.2.5 -> YXDL.B.2.5.1
  41. YXDL.A -> YXDL.B.3
  42. YXDL.A -> YXDL.B.3 -> YXDL.B.3.1
  43. YXDL.A -> YXDL.B.3 -> YXDL.B.3.1 -> YXDL.B.3.1.1
  44. YXDL.A -> YXDL.B.3 -> YXDL.B.3.1 -> YXDL.B.3.1.1 -> YXDL.B.3.1.1.1
  45. YXDL.A -> YXDL.B.3 -> YXDL.B.3.1 -> YXDL.B.3.1.2
  46. YXDL.A -> YXDL.B.3 -> YXDL.B.3.1 -> YXDL.B.3.1.2 -> YXDL.B.3.1.2.1
  47. YXDL.A -> YXDL.B.3 -> YXDL.B.3.1 -> YXDL.B.3.1.3
  48. YXDL.A -> YXDL.B.3 -> YXDL.B.3.2
  49. YXDL.A -> YXDL.B.3 -> YXDL.B.3.2 -> YXDL.B.3.2.1
  50. YXDL.A -> YXDL.B.3 -> YXDL.B.3.3
  51. YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.1
  52. YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.1 -> YXDL.B.3.3.1.1
  53. YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.2
  54. YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.2 -> YXDL.B.3.3.2.1
  55. YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.2 -> YXDL.B.3.3.2.2
  56. YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.3
  57. YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.3 -> YXDL.B.3.3.3.1
  58. YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.4
  59. YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.5
  60. YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.5 -> YXDL.B.3.3.5.1
  61. YXDL.A -> YXDL.B.3 -> YXDL.B.3.4
  62. YXDL.A -> YXDL.B.3 -> YXDL.B.3.5
  63. YXDL.A -> YXDL.B.3 -> YXDL.B.3.6
  64. YXDL.A -> YXDL.B.4
  65. YXDL.A -> YXDL.B.5
  66. YXDL.A -> YXDL.B.6
复制代码
~
v2: ~
  1. #!/usr/bin/perl

  2. use Data::Dumper;
  3. $Data::Dumper::Terse    = 1;
  4. $Data::Dumper::Sortkeys = 1;
  5. $Data::Dumper::Pair     = ': ';

  6. my $tree;

  7. while (<DATA>) {
  8.     chomp;
  9.     my @p = split /\s+->\s+/;
  10.     my $p = $tree->{ shift @p } ||= {};
  11.     $p = $p->{$_} ||= {} for @p;
  12. }

  13. sub from {
  14.     my $p = shift;
  15.     map {
  16.         my ( $n, $c ) = @$_;
  17.         { Name => $n, %$c ? ( children => [ from($c) ] ) : () }
  18.     } map { [ $_, $p->{$_} ] } sort keys %$p;
  19. }

  20. my @data = from $tree;
  21. print Dumper \@data;


  22. __DATA__
  23. YXDL.A -> YXDL.B.1
  24. YXDL.A -> YXDL.B.1 -> YXDL.B.1.1
  25. YXDL.A -> YXDL.B.2
  26. YXDL.A -> YXDL.B.2 -> YXDL.B.2.1
  27. YXDL.A -> YXDL.B.2 -> YXDL.B.2.1 -> YXDL.B.2.1.1
  28. YXDL.A -> YXDL.B.2 -> YXDL.B.2.2
  29. YXDL.A -> YXDL.B.2 -> YXDL.B.2.2 -> YXDL.B.2.2.1
  30. YXDL.A -> YXDL.B.2 -> YXDL.B.2.2 -> YXDL.B.2.2.2
  31. YXDL.A -> YXDL.B.2 -> YXDL.B.2.3
  32. YXDL.A -> YXDL.B.2 -> YXDL.B.2.3 -> YXDL.B.2.3.1
  33. YXDL.A -> YXDL.B.2 -> YXDL.B.2.4
  34. YXDL.A -> YXDL.B.2 -> YXDL.B.2.5
  35. YXDL.A -> YXDL.B.2 -> YXDL.B.2.5 -> YXDL.B.2.5.1
  36. YXDL.A -> YXDL.B.3
  37. YXDL.A -> YXDL.B.3 -> YXDL.B.3.1
  38. YXDL.A -> YXDL.B.3 -> YXDL.B.3.1 -> YXDL.B.3.1.1
  39. YXDL.A -> YXDL.B.3 -> YXDL.B.3.1 -> YXDL.B.3.1.1 -> YXDL.B.3.1.1.1
  40. YXDL.A -> YXDL.B.3 -> YXDL.B.3.1 -> YXDL.B.3.1.2
  41. YXDL.A -> YXDL.B.3 -> YXDL.B.3.1 -> YXDL.B.3.1.2 -> YXDL.B.3.1.2.1
  42. YXDL.A -> YXDL.B.3 -> YXDL.B.3.1 -> YXDL.B.3.1.3
  43. YXDL.A -> YXDL.B.3 -> YXDL.B.3.2
  44. YXDL.A -> YXDL.B.3 -> YXDL.B.3.2 -> YXDL.B.3.2.1
  45. YXDL.A -> YXDL.B.3 -> YXDL.B.3.3
  46. YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.1
  47. YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.1 -> YXDL.B.3.3.1.1
  48. YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.2
  49. YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.2 -> YXDL.B.3.3.2.1
  50. YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.2 -> YXDL.B.3.3.2.2
  51. YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.3
  52. YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.3 -> YXDL.B.3.3.3.1
  53. YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.4
  54. YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.5
  55. YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.5 -> YXDL.B.3.3.5.1
  56. YXDL.A -> YXDL.B.3 -> YXDL.B.3.4
  57. YXDL.A -> YXDL.B.3 -> YXDL.B.3.5
  58. YXDL.A -> YXDL.B.3 -> YXDL.B.3.6
  59. YXDL.A -> YXDL.B.4
  60. YXDL.A -> YXDL.B.5
  61. YXDL.A -> YXDL.B.6
复制代码
Dumper:
  1. [
  2.   {
  3.     'Name': 'YXDL.A',
  4.     'child': [
  5.                  {
  6.                    'Name': 'YXDL.B.1',
  7.                    'child': [
  8.                                 {
  9.                                   'Name': 'YXDL.B.1.1'
  10.                                 }
  11.                               ]
  12.                  },
  13.                  {
  14.                    'Name': 'YXDL.B.2',
  15.                    'child': [
  16.                                 {
  17.                                   'Name': 'YXDL.B.2.1',
  18.                                   'child': [
  19.                                                {
  20.                                                  'Name': 'YXDL.B.2.1.1'
  21.                                                }
  22.                                              ]
  23.                                 },
  24.                                 {
  25.                                   'Name': 'YXDL.B.2.2',
  26.                                   'child': [
  27.                                                {
  28.                                                  'Name': 'YXDL.B.2.2.1'
  29.                                                },
  30.                                                {
  31.                                                  'Name': 'YXDL.B.2.2.2'
  32.                                                }
  33.                                              ]
  34.                                 },
  35.                                 {
  36.                                   'Name': 'YXDL.B.2.3',
  37.                                   'child': [
  38.                                                {
  39.                                                  'Name': 'YXDL.B.2.3.1'
  40.                                                }
  41.                                              ]
  42.                                 },
  43.                                 {
  44.                                   'Name': 'YXDL.B.2.4'
  45.                                 },
  46.                                 {
  47.                                   'Name': 'YXDL.B.2.5',
  48.                                   'child': [
  49.                                                {
  50.                                                  'Name': 'YXDL.B.2.5.1'
  51.                                                }
  52.                                              ]
  53.                                 }
  54.                               ]
  55.                  },
  56.                  {
  57.                    'Name': 'YXDL.B.3',
  58.                    'child': [
  59.                                 {
  60.                                   'Name': 'YXDL.B.3.1',
  61.                                   'child': [
  62.                                                {
  63.                                                  'Name': 'YXDL.B.3.1.1',
  64.                                                  'child': [
  65.                                                               {
  66.                                                                 'Name': 'YXDL.B.3.1.1.1'
  67.                                                               }
  68.                                                             ]
  69.                                                },
  70.                                                {
  71.                                                  'Name': 'YXDL.B.3.1.2',
  72.                                                  'child': [
  73.                                                               {
  74.                                                                 'Name': 'YXDL.B.3.1.2.1'
  75.                                                               }
  76.                                                             ]
  77.                                                },
  78.                                                {
  79.                                                  'Name': 'YXDL.B.3.1.3'
  80.                                                }
  81.                                              ]
  82.                                 },
  83.                                 {
  84.                                   'Name': 'YXDL.B.3.2',
  85.                                   'child': [
  86.                                                {
  87.                                                  'Name': 'YXDL.B.3.2.1'
  88.                                                }
  89.                                              ]
  90.                                 },
  91.                                 {
  92.                                   'Name': 'YXDL.B.3.3',
  93.                                   'child': [
  94.                                                {
  95.                                                  'Name': 'YXDL.B.3.3.1',
  96.                                                  'child': [
  97.                                                               {
  98.                                                                 'Name': 'YXDL.B.3.3.1.1'
  99.                                                               }
  100.                                                             ]
  101.                                                },
  102.                                                {
  103.                                                  'Name': 'YXDL.B.3.3.2',
  104.                                                  'child': [
  105.                                                               {
  106.                                                                 'Name': 'YXDL.B.3.3.2.1'
  107.                                                               },
  108.                                                               {
  109.                                                                 'Name': 'YXDL.B.3.3.2.2'
  110.                                                               }
  111.                                                             ]
  112.                                                },
  113.                                                {
  114.                                                  'Name': 'YXDL.B.3.3.3',
  115.                                                  'child': [
  116.                                                               {
  117.                                                                 'Name': 'YXDL.B.3.3.3.1'
  118.                                                               }
  119.                                                             ]
  120.                                                },
  121.                                                {
  122.                                                  'Name': 'YXDL.B.3.3.4'
  123.                                                },
  124.                                                {
  125.                                                  'Name': 'YXDL.B.3.3.5',
  126.                                                  'child': [
  127.                                                               {
  128.                                                                 'Name': 'YXDL.B.3.3.5.1'
  129.                                                               }
  130.                                                             ]
  131.                                                }
  132.                                              ]
  133.                                 },
  134.                                 {
  135.                                   'Name': 'YXDL.B.3.4'
  136.                                 },
  137.                                 {
  138.                                   'Name': 'YXDL.B.3.5'
  139.                                 },
  140.                                 {
  141.                                   'Name': 'YXDL.B.3.6'
  142.                                 }
  143.                               ]
  144.                  },
  145.                  {
  146.                    'Name': 'YXDL.B.4'
  147.                  },
  148.                  {
  149.                    'Name': 'YXDL.B.5'
  150.                  },
  151.                  {
  152.                    'Name': 'YXDL.B.6'
  153.                  }
  154.                ]
  155.   }
  156. ]
复制代码

论坛徽章:
0
3 [报告]
发表于 2014-02-28 10:50 |只看该作者
回复 2# rubyish

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

这段没看太明白... 求解释


   

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
4 [报告]
发表于 2014-03-01 01:08 |只看该作者
本帖最后由 rubyish 于 2014-02-28 21:41 编辑

print Dumper $tree;

  1. ..........
  2.                                 'YXDL.B.3.3' => {
  3.                                                   'YXDL.B.3.3.1' => {
  4.                                                                       'YXDL.B.3.3.1.1' => {}
  5.                                                                     },
  6.                                                   'YXDL.B.3.3.2' => {
  7.                                                                       'YXDL.B.3.3.2.1' => {},
  8.                                                                       'YXDL.B.3.3.2.2' => {}
  9.                                                                     },
  10.                                                   'YXDL.B.3.3.3' => {
  11.                                                                       'YXDL.B.3.3.3.1' => {}
  12.                                                                     },
  13.                                                   'YXDL.B.3.3.4' => {},
  14.                                                   'YXDL.B.3.3.5' => {
  15.                                                                       'YXDL.B.3.3.5.1' => {}
  16.                                                                     }
  17.                                                 },
  18.                                 'YXDL.B.3.4' => {},
  19.                                 'YXDL.B.3.5' => {},
  20.                                 'YXDL.B.3.6' => {}
  21.                               },
  22.                 'YXDL.B.4' => {},
  23.                 'YXDL.B.5' => {},
  24.                 'YXDL.B.6' => {}
复制代码
~
~
that 段 eq this
this 段 is better
  1. sub from {
  2.     my $p = shift;
  3.     map {
  4.         my ( $n, $c ) = @$_;
  5.         { Name => $n, %$c ? ( children => [ from($c) ] ) : () }
  6.     } map { [ $_, $p->{$_} ] } sort keys %$p;
  7. }
复制代码
.
.
解释:
  1. sub from {
  2.     my $persons = shift;
  3.     my %persons = %{$persons};
  4.     my @persons = map { [ $_, $persons{$_} ] } sort keys %persons;
  5.     map {
  6.         my ( $name, $children ) = @$_;
  7.         keys %$children > 0       # has children
  8.           ? { Name => $name, children => [ from($children) ] }
  9.           : { Name => $name }
  10.     } @persons;
  11. }
复制代码
.
.
no children
'YXDL.B.6' => {}

return: { Name => $name }

has children
'YXDL.B.3.3.5' => { 'YXDL.B.3.3.5.1' => {}  }

return:  { Name => $name, children => [ from($children) ] }

论坛徽章:
0
5 [报告]
发表于 2014-03-03 09:40 |只看该作者
))
明白了谢谢~~~

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
6 [报告]
发表于 2014-03-05 05:08 |只看该作者
v2:~
  1. #!/usr/bin/perl

  2. use Data::Dumper;
  3. $Data::Dumper::Terse    = 1;
  4. $Data::Dumper::Sortkeys = 1;
  5. $Data::Dumper::Pair     = ': ';

  6. my $tree;

  7. while (<DATA>) {
  8.     chomp;
  9.     my @p = split /\s+->\s+/;
  10.     my $p = $tree->{ shift @p } ||= {};
  11.     $p = $p->{$_} ||= {} for @p;
  12. }

  13. sub from {
  14.     my $p = shift;
  15.     map {
  16.         my ( $n, $c ) = @$_;
  17.         { Name => $n, %$c ? ( child => [ from($c) ] ) : () }
  18.     } map { [ $_, $p->{$_} ] } sort keys %$p;
  19. }

  20. my @data = from $tree;
  21. print Dumper \@data;


  22. __DATA__
  23. YXDL.A -> YXDL.B.1
  24. YXDL.A -> YXDL.B.1 -> YXDL.B.1.1
  25. YXDL.A -> YXDL.B.2
  26. YXDL.A -> YXDL.B.2 -> YXDL.B.2.1
  27. YXDL.A -> YXDL.B.2 -> YXDL.B.2.1 -> YXDL.B.2.1.1
  28. YXDL.A -> YXDL.B.2 -> YXDL.B.2.2
  29. YXDL.A -> YXDL.B.2 -> YXDL.B.2.2 -> YXDL.B.2.2.1
  30. YXDL.A -> YXDL.B.2 -> YXDL.B.2.2 -> YXDL.B.2.2.2
  31. YXDL.A -> YXDL.B.2 -> YXDL.B.2.3
  32. YXDL.A -> YXDL.B.2 -> YXDL.B.2.3 -> YXDL.B.2.3.1
  33. YXDL.A -> YXDL.B.2 -> YXDL.B.2.4
  34. YXDL.A -> YXDL.B.2 -> YXDL.B.2.5
  35. YXDL.A -> YXDL.B.2 -> YXDL.B.2.5 -> YXDL.B.2.5.1
  36. YXDL.A -> YXDL.B.3
  37. YXDL.A -> YXDL.B.3 -> YXDL.B.3.1
  38. YXDL.A -> YXDL.B.3 -> YXDL.B.3.1 -> YXDL.B.3.1.1
  39. YXDL.A -> YXDL.B.3 -> YXDL.B.3.1 -> YXDL.B.3.1.1 -> YXDL.B.3.1.1.1
  40. YXDL.A -> YXDL.B.3 -> YXDL.B.3.1 -> YXDL.B.3.1.2
  41. YXDL.A -> YXDL.B.3 -> YXDL.B.3.1 -> YXDL.B.3.1.2 -> YXDL.B.3.1.2.1
  42. YXDL.A -> YXDL.B.3 -> YXDL.B.3.1 -> YXDL.B.3.1.3
  43. YXDL.A -> YXDL.B.3 -> YXDL.B.3.2
  44. YXDL.A -> YXDL.B.3 -> YXDL.B.3.2 -> YXDL.B.3.2.1
  45. YXDL.A -> YXDL.B.3 -> YXDL.B.3.3
  46. YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.1
  47. YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.1 -> YXDL.B.3.3.1.1
  48. YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.2
  49. YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.2 -> YXDL.B.3.3.2.1
  50. YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.2 -> YXDL.B.3.3.2.2
  51. YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.3
  52. YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.3 -> YXDL.B.3.3.3.1
  53. YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.4
  54. YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.5
  55. YXDL.A -> YXDL.B.3 -> YXDL.B.3.3 -> YXDL.B.3.3.5 -> YXDL.B.3.3.5.1
  56. YXDL.A -> YXDL.B.3 -> YXDL.B.3.4
  57. YXDL.A -> YXDL.B.3 -> YXDL.B.3.5
  58. YXDL.A -> YXDL.B.3 -> YXDL.B.3.6
  59. YXDL.A -> YXDL.B.4
  60. YXDL.A -> YXDL.B.5
  61. YXDL.A -> YXDL.B.6
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP