gpt4 book ai didi

json - 将目录及其子目录的内容转换为 JSON

转载 作者:行者123 更新时间:2023-12-04 10:48:10 25 4
gpt4 key购买 nike

我有以下来自 this 的 perl 脚本将目录内容转换为 JSON 的堆栈交换问题。

use File::Find; 
use JSON;
use strict;
use warnings;

my $dirs={};
my $encoder = JSON->new->ascii->pretty;
find({wanted => \&process_dir, no_chdir => 1 }, ".");

print $encoder->encode($dirs);
sub process_dir {
return if !-d $File::Find::name;
my $ref=\%$dirs;

for(split(/\//, $File::Find::name)) {
$ref->{$_} = {}
if(!exists $ref->{$_});
$ref = $ref->{$_};
}
}

我在 Android 6.0 上使用 Termux 运行脚本。

考虑以下目录:
.
|--server .
| | - File 1.tmp
| | - File 2.sql
| | - File 3.sql
|-- js .
| | - File 1.js
| | - File 2.js
| | - File 3.js
| -css .
| | - File 1.js
| | - File 2.js
| | - File 3.js
| -assets .
| | - Font-awesome
| | .
| | | - webfont.
| | | | - File 2.woff
| | | | - File 2.woff
| | | | - File 3.woff
| | | - css .
| | | | - File 2.css
| | | | - File 2.css
| | | | - File 3.css
| | - Fonts
| | | - ps .
| | | | - File 2.woff
| | | | - File 2.css
| | | | - File 3.txt
| | - images
| | | - File 1.png
| | | - File 2.png
| | | - File 3.svg

如果我在上面的目录中执行脚本,它会返回以下内容:
{
"." : {
"server" : {},
"js" : {},
"css" : {},
"assets" : {
"fonts" : {
"ps":{}
},
"images" : {},
"font-awesome" : {
"css" :{},
"webfonts" : {}
}
}
}
}

我正在尝试编辑脚本以将每个子目录中的文件另外包含为 Js 数组(如果可以使用 perl + JSON 模块,或者仅使用 Perl)

例如 [编辑]
{
"." : {
"server" : {"Files": ["File1", "File2", "File n"]},
/* Or just "server" : ["File1", "File2", "File n"], ... */
"js" : {"Files": ["File1", "File2", "File n"]},
"assets" : {
"fonts" : {
"ps":{"Files": ["File1", "File2", "File n"]}
},
"images" : {"Files": ["File1", "File2", "File n"]},
"font-awesome" : {
"css" : {"Files": ["File1", "File2", "File n"]}
"webfonts" : {"Files": ["File1", "File2", "File n"]}
}
}
}
}

这是可以实现的吗?如果是这样,我应该怎么做?我对 perl 比较陌生,我很难理解这一点。

最佳答案

我试了一下,决定用特殊键 __files__ 将文件名移动到一个条目中。 .如果您有一个这样命名的目录,这将中断。

use File::Find; 
use JSON;
use strict;
use warnings;
use 5.12.0;
use Data::Dumper;
my $dirs={};
my $encoder = JSON->new->ascii->pretty;
find({wanted => \&process_dir, no_chdir => 1 }, ".");
print $encoder->encode($dirs);
sub process_dir {
my $full_name = $File::Find::name;
my $ref=$dirs;
if (-d $full_name ) {
for (split(/\//, $full_name)) { # only directories
$ref->{$_} ||= {}; # create the next level if it does not exist
$ref = $ref->{$_}; # move to the next level
}
} else {
for (split(/\//, $full_name)){ # n directories and 1 filename
if (exists $ref->{$_}) { # it's a directory
$ref = $ref->{$_}
} else {
push @{$ref->{__files__}}, $_; # it's a filename
# $ref->{$_} = '_is_file_';
}
}
}
}

关于json - 将目录及其子目录的内容转换为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59603087/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com