use strict; use warnings; my (%posts, @threads, $id, $root, $board, $parent, $stamp, $title); my @array; while () { chomp($_); my @subarray = split(/,/,$_); push @array, [@subarray]; } my @sortedarray = sort { $a->[4] cmp $b->[4] } @array; for my $x (0..$#sortedarray) { ($id, $root, $board, $parent, $stamp, $title) = @{$sortedarray[$x]}; my %post = ('id' => $id, 'root' => $root, 'parent' => $parent, 'stamp' => $stamp, 'title' => $title); $posts{$id} = \%post; if ($id == $parent) { push @threads, \%post; } else { push @{$posts{$parent}{'children'}}, \%post; } } construct($_) for @threads; sub construct { my $p = $_[0]; print "$p->{'id'} $p->{'title'}\n"; construct($_) for @{$p->{'children'}}; } #id,board,root,parent,stamp,text __DATA__ 1,2,0,1,2006-01-02 08:15:00,test line 1 (first) 2,2,1,1,2006-01-02 08:16:00,test line 2 (second) 3,2,1,2,2006-01-02 08:21:00,test line 3 (third) 6,2,1,1,2006-01-02 08:23:00,test line 6 (seventh) 4,2,1,1,2006-01-02 08:22:00,test line 4 (sixth) 7,2,1,6,2006-01-02 08:25:00,test line 7 (eighth) 5,2,1,3,2006-01-02 08:23:00,test line 5 (fourth) 8,2,1,1,2006-01-02 08:17:00,test line 8 (fifth)