#!/usr/bin/perl -w use warnings; use strict; my ($tag, %list); while (){ next unless /./; if (/^(\w+)/){ $tag = $1; next; } if (/^-- (\w+)/){ push @{$list{$tag}}, $1; } } print "get_call_chains\n"; print "---------------\n"; for my $call_chain ( get_call_chains("main") ){ print join(" ", @$call_chain),"\n"; } print "\n\n"; print "print_call_chains\n"; print "-----------------\n"; print_call_chains("main"); sub get_call_chains { my $root = shift; my @calls; if( exists $list{$root} ){ for (@{$list{$root}}){ push @calls, get_call_chains($_); } } else { @calls = ([]); } unshift @$_, $root for @calls; return @calls } sub print_call_chains { my @stack = @_; my $current = $stack[$#stack]; if(exists $list{$current}) { for (@{$list{$current}}){ print_call_chains(@stack, $_); } } else { print join(" ", @stack),"\n"; } } __END__ main -- check -- check1 check -- computing -- net check1 -- computing2 -- net2 computing -- community