perl - 在 Perl 中创建符合 Fancytree 预期 JSON 格式的目录树

标签 perl tree-traversal fancytree

如何在 Perl 中创建目录树以符合 Fancytree 预期的 JSON format ?
这是我想出的 Perl 部分,它遍历给定的路径:

sub get_tree
{
    my ($gpath) = @_;
    my %r;

    use File::Find;
    my $c = sub {
        my $dir  = $File::Find::dir;
        my $r    = \%r;

        my $tdir = $dir;
        $tdir    =~ s|^\Q$gpath\E/?||;

        $r = $r->{$_} ||= {} for split m|/|, $tdir;
    };
    find($c, $gpath);
    return \%r;
}
JSON 编码后返回如下结果:
 {
  "dir3":{

  },
  "dir1":{
    "sub-dir2":{

    },
    "sub-dir1":{

    }
  },
  "dir2":{
    "sub-dir1":{
      "sub-sub-dir1":{
        "sub-sub-sub-dir1":{

        }
      }
    }
  }
}
Fancytree 符合其 JSON 的预期结果 format是:
[
    {"parent": "dir3"},
    {"parent": "dir2", "child": [
       {"parent": "sub-dir1", "child": [
          {"parent": "sub-sub-dir1", "child": [
             {"parent": "sub-sub-sub-dir1"}
          ]}
       ]}
    ]},
    {"parent": "dir1", "child": [
       {"parent": "sub-dir1"},
       {"parent": "sub-dir1"}
    ]}
]
关键是在一次运行中完成,没有后期处理,这将是理想的。
有关如何实现这一目标的任何帮助?

最佳答案

你可以试试,

use strict;
use warnings;
use Data::Dumper;

sub get_tree {
    my ($gpath) = @_;
    my %r;
    my @root;

    use File::Find;
    my $cb = sub {

        my $tdir = $File::Find::dir;
        $tdir    =~ s|^\Q$gpath\E/?||;
        return if $r{$tdir} or !$tdir;

        my ($pdir, $cdir) = $tdir =~ m|^ (.+) / ([^/]+) \z|x;
        my $c = $r{$tdir} = { parent => $cdir // $tdir };

        if (defined $pdir) { push @{ $r{$pdir}{child} }, $c }
        else { push @root, $c }

    };
    find($cb, $gpath);
    return \@root;
}

它使用哈希来快速查找节点,完整的目录结构建立在 @root 之上。 .

关于perl - 在 Perl 中创建符合 Fancytree 预期 JSON 格式的目录树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49337768/

相关文章:

perl - Perl 正则表达式匹配中的数字符号 (#) 是什么意思?

binary-tree - 通过修改 morris 遍历实现 PreOrder 和 PostOrder 遍历

algorithm - 后序图遍历?

javascript - scrollIntoView() 没有将节点滚动到树的顶部

jquery - 自定义搜索 jQuery FancyTree 插件

javascript - 如何获取 fancytree 中某个节点的所有子节点?

regex - 为什么是s/^\s+|\s+$//g;比两个单独的替换慢得多?

perl - 如何为可选的子程序参数指定默认值?

perl - 在 Perl 中测试两个散列键是否具有相同的结构

algorithm - 为什么只有四种树遍历算法?