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

前端之家收集整理的这篇文章主要介绍了在Perl中创建符合Fancytree预期JSON格式的目录树前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如何在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相关文章