#!/usr/bin/perl use strict; use warnings; my $start = '2A'; my %data; for my $line () { chomp $line; my ($key, $value) = split / --> /, $line; if ( exists $data{$key} ) { push @{ $data{$key} }, $value; } else { $data{$key} = [$value]; } } do_tree( $start ); sub do_tree { my $start = shift; for my $node (@{ $data{ $start } }) { print "$start --> $node\n"; do_tree( $node ); } } __DATA__ 1A --> 2A 1A --> 2B 2A --> 4A 2A --> 5A 4A --> 5A 2B --> 3A 3A --> 4A