2011-04-09 17 views
0

我有一个对象列表,它们可能相互关联也可能不相关。一些元素是其他元素的子元素,这些元素又可能是另一个元素的子元素。有些可能与其他元素相同或完全无关。例如,假设列表是{A,B,C,D,E,F},其关系如A⊂B⊂C,D = E且F≠{A,B,C,D,E ,F}。我希望显示这种关系,也许像如何使用perl对表示子集和超集对象的N元树中的对象列表进行排序?

-> C 
    +-B 
    +-A 
-> D 
    | 
-> E 
-> F 

我只是需要一些指导上手,也许是执行此类任务的模块。我能想到的几种方法越来越复杂&恐吓我的新脚本技能。希望有人能帮助我。

回答

1

CPAN上有几个树模块。 Tree,Tree::DAG_NodeTree::Simple都看起来像他们可以做你想做的。

+0

确实非常有用。我在Tree :: DAG_Node上找到了一个非常好的教程(http://www.perlmonks.org/?node_id=153259),并取得了很好的进展。但现在我陷入了一个n00b问题。请帮我解决这个问题。我有这样一段代码,从叶子到根节点,并根据比较插入一个新节点。但是,当我插入节点时,我需要跳出子例程,否则它会一直插入每个父节点,直到根节点(根据定义,所有子节点都是父节点的子集)。我将在下一条评论中发布代码片段。 – Benny 2011-04-09 15:23:26

+0

'$ root-> walk_down({callbackback => sub {$ node = shift; \t if($ node-> name> $ compare){$ node-> new_daughter-> name($ compare); last ;} } });' 我不想使用'exit'或'die',因为在这之后我还有其他的东西要做。当我使用'last'时,我得到下面的错误: _不能在循环块外“last”_ – Benny 2011-04-09 15:25:47

+0

@Benny'last'将不起作用,这是循环。我认为你所需要做的就是返回false来停止遍历。 walk_down的文档说“这个函数必须返回true或false - 如果为false,它会阻止下一步”,下一步是遍历到子节点。该文件还称“从回调中修改树是一个坏主意”,它建议注意回调中需要改变的地方并将它们放在外面。 '我的$目标; ... sub {my $ n = shift; if($ n-> name> $ compare){$ target = $ n;返回; } else {return 1}}; ... $ target-> new_daughter-> name($ compare);' – Schwern 2011-04-09 15:36:13

相关问题