如何在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的顶部构建完整的目录结构.