LINUX.ORG.RU

[perl][recursion] Вывод деревьев сообщений

 ,


0

1

Есть код:

#!/usr/bin/perl -w

use strict;
use warnings;
use v5.10;

my $messages = [
	{
		id			=> 1,
		root_id		=> 0,
		reply_to	=> 0,
		from_id		=> 1,
		to_id		=> 2,
		content		=> "Hello!\t"
	},
	{
		id			=> 2,
		root_id		=> 1,
		reply_to	=> 1,
		from_id		=> 2,
		to_id		=> 1,
		content		=> "> Hello!\tHi\t"
	},
	{
		id			=> 3,
		root_id		=> 0,
		reply_to	=> 0,
		from_id		=> 1,
		to_id		=> 2,
		content		=> "Privet! Kak dela?"
	},
	{
		id			=> 4,
		root_id		=> 3,
		reply_to	=> 3,
		from_id		=> 2,
		to_id		=> 2,
		content		=> "nHx!"
	},
	{
		id			=> 5,
		root_id		=> 1,
		reply_to	=> 2,
		from_id		=> 1,
		to_id		=> 2,
		content		=> ">> Hello!\t> Hi\tWhat's up?\t"
	}
];

sub get_tree {
	my ($tree, $pid) = @_;

	my $msg = "\n";

	foreach my $row (@{$tree}) {
		if($row->{reply_to} eq $pid) {
			$msg .= "# ".$row->{content}.&get_tree($tree, $row->{id});
		}
	}

	return $msg;
}

print &get_tree($messages, 0, 0);

Как сделать проход не только по `reply_to`, но и сначала по `root_id`? `root_id` - идентификатор сообщения-корневого узла дерева треда.

★★

Ну раз так долго никто не пишет, выскажусь, пожалуй. В пхп есть замечательный класс RecursiveTreeIterator (библиотека spl). Если все-таки нужно на перле, можно написать перловый скрипт, запускающий пхп-интерпретатор.

heisenberg ★★
()
Ответ на: комментарий от heisenberg

Спасибо, гляну либу, попробую выдрать из неё нужное.

VeroLom ★★
() автор топика
sub get_tree {
	my ($tree,$root_id,$reply_id)=@_;
	return "\n".join "", map {
		$_->{content}.get_tree($tree,$_->{root_id},$_->{id})
	} grep {
		$_->{root_id}==$root_id && $_->{reply_to}==$reply_id
	} @{$tree};
}
my %seen=();
print join "", map { get_tree($messages,$_,0) } grep { ! $seen{$_} ++ } map { $_->{root_id} } @{$messages};
anonymous
()
Ответ на: комментарий от VeroLom

У тебя у всех остальных сообщений отсутствуют родители (они показывают на сообщения не в своей ветке)

anonymous
()
Ответ на: комментарий от anonymous

Хм, запутался наверное :) Завтра проверю на работе

VeroLom ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.