Я пытаюсь привести в порядок большую структуру данных в Perl, которая была прочитана из JSON. Два стереотипных элемента выглядят так (в JSON):
[
[ [ {'payload':'test'} ], [ [ {'payload':'reply'} ], [] ] ],
[ [ {'payload':'another thread'} ]
]
Я хочу полностью удалить эту пустую ссылку на массив в нижней части этого элемента и заменить каждую ссылку на массив, содержащую только один хэш-ссылку, содержащейся в ней хеш-ссылкой. Другими словами, результат должен быть таким:
[
[ {'payload':'test'}, [ {'payload':'reply'} ] ],
[ {'payload':'another thread'} ]
]
В настоящее время мой код выглядит следующим образом:
use v5.12;
use strict;
use warnings;
use JSON::XS;
use Data::Walk;
sub cleanup {
if (ref $_ eq 'ARRAY') {
if (scalar(@{$_}) == 0) {
die 'mysteriously I never reach this branch!';
while (my ($key,$value) = each @{$Data::Walk::container}) {
if ($value == $_) {
delete ${$Data::Walk::container}[$key]
}
}
} elsif (scalar(@{$_}) == 1 and ref @{$_}[0]) {
$_ = @{$_}[0];
} else {
my $tail = ${$_}[scalar(@{$_})-1];
if (ref $tail eq 'ARRAY' and scalar(@{$tail}) == 0) {
$#{$_}--;
}
}
}
}
sub get {
my $begin = shift;
$begin = 0 unless $begin;
my $end = shift();
$end = $begin + 25 unless $end;
my $threads;
{
local $/;
open(my $f, '<emails.json');
$threads = decode_json <$f>;
close($f);
}
$threads = [ @{$threads}[$begin .. $end] ];
walkdepth(\&eliminate_singleton, $threads);
return $threads;
}
print JSON::XS->new->ascii->pretty->encode(&get('subject:joke'));
и хотя ему удается удалить пустую ссылку на массив, он не может свернуть синглтоны. Как можно исправить этот код, чтобы он мог схлопнуть синглтоны?
notmuch
с запросомsubject:joke
для генерации данных JSON. Эти вещи несущественны для проблемы и неизвестны людям, которые пытаются вам помочь, и требуется значительный объем работы, чтобы разобрать ваш код и отличить соответствующие части от нерелевантных. Хорошо, что вы показали некоторые данные, но в настоящее время это недопустимый JSON, и нетривиально увидеть, как его использовать в вашей программе. В результате очень мало ответов. - person Borodin   schedule 26.06.2012