我正在尝试制作分类文本,但在转弯时遇到问题
(class1 (subclass1) (subclass2 item1 item2))
收件人
(class1 (subclass1 item1) (subclass2 item1 item2))
我不知道在不将subclass1
缓存在内存中的情况下,将文本从上移到下。我在Linux上使用Perl,因此欢迎使用Shell脚本或Perl的任何解决方案。
编辑:我尝试过使用grep,将整个subclass1
保存在变量中,然后进行修改并将其导出到列表中;但列表可能会变大,这样会占用大量内存。
答案 0 :(得分:2)
我不知道将上面的文字变成下面的文字
一般方法:
解析文本。
您似乎有用空格分隔的列表和原子的列表。如果是这样,结果可能如下所示:
{
type => 'list',
value => [
{
type => 'atom',
value => 'class1',
},
{
type => 'list',
value => [
{
type => 'atom',
value => 'subclass1',
},
]
},
{
type => 'list',
value => [
{
type => 'atom',
value => 'subclass2',
},
{
type => 'atom',
value => 'item1',
},
{
type => 'atom',
value => 'item2',
},
],
}
],
}
可能会生成更简单的内容,但是您对格式的细节了解得很少。
从树中提取必要的信息。
您了解了有关数据格式的详细信息,但是如果上面的数据结构是由解析器创建的,则它可能像下面这样简单:
my $item = $tree->{value}[2]{value}[1]{value};
执行所需的修改。
您了解了有关数据格式的详细信息,但是如果上面的数据结构是由解析器创建的,则它可能像下面这样简单:
my $new_atom = { type => 'atom', value => $item };
push @{ $tree->{value}[1]{value} }, $new_atom;
序列化数据结构。
对于上述数据结构,您可以使用以下内容:
sub serialize {
my ($node) = @_;
return $node->{type} eq 'list'
? "(".join(" ", map { serialize($_) } @{ $node->{value} }).")"
: $node->{value};
}
根据具体情况,还可以使用其他方法。