use strict; use warnings; use Data::Dump; my %depends; while () { chomp; my ($job, @deps) = split ','; $depends{$job}{$_} = undef for @deps; } addDepends (\%depends, $_, keys %{$depends{$_}}) for keys %depends; print Data::Dump::dump(\%depends); sub addDepends { my ($depends, $target, @deps) = @_; for my $dep (@deps) { next if $depends->{$target}{$dep}++; addDepends($depends, $target, keys %{$depends{$dep}}); } } __DATA__ job1, job2,job1, job3,job2 job4,job2 job5,job2,job4 job6,jobz joba,job4,jobb jobz,jobbc,job2