#!/usr/bin/perl use strict; use warnings; my %chain; # read the chain: while (){ chomp; my ($key, $val) = split m/ \| /; push @{$chain{$key}}, $val; } # walk the chain starting from 12: walk(12); sub walk { my $c = shift; print "Visiting $c\n"; for (@{$chain{$c}}){ walk($_); } } __DATA__ 23 | 32 12 | 45 12 | 35 12 | 67 45 | 34 34 | 90 34 | 55 35 | 53 35 | 44 44 | 41 #### Visiting 12 Visiting 45 Visiting 34 Visiting 90 Visiting 55 Visiting 35 Visiting 53 Visiting 44 Visiting 41 Visiting 67