%lookup = map { join(',', $_->[0], $_->[1]) => join(',', $_->[2], $_->[3]) } @r; $start = $next = (sort(keys(%lookup)))[0]; #$start = $next = (keys(%lookup))[0]; do { $current = $next; push(@x, [ split(/,/, $current) ]); $next = $lookup{$current}; delete($lookup{$current}); die("broken or repeat!\n") unless defined($next); } while ($next ne $start);