#!/usr/bin/perl use warnings; use strict; sub get_arr { my $key = shift; my $href = shift; my %h = %{$href}; my @arr = (); foreach my $i (@{$h{$key}}) { if (exists($h{$i})) { push(@arr, &get_arr($i, $href)); } else { push(@arr, $i); } } return @arr; } sub getHashRefFromData { my @d = ; my %h = (); foreach my $i (@d) { chomp($i); my @a = split(": ", $i); my @b = split(", ", $a[1]); $h{$a[0]} = []; foreach my $u (@b) { push(@{$h{$a[0]}}, $u); } } return \%h; } my $h = &getHashRefFromData(); for (my $i=1; $i<=9; $i++) { my $a = "[$i]"; print "$a\t"; my @res = &get_arr($a, $h); my $x = 0; foreach my $u (@res) { print "$u"; if ($x < $#res){ print ", "; } $x++; } print "\n"; } __DATA__ [1]: a, b [2]: c, [1] [3]: d, e [4]: f, [3] [5]: g, h [6]: i, [5] [7]: [2], [4] [8]: j, [6] [9]: [7], [8]