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 #### { job1 => {}, job2 => { job1 => 1 }, job3 => { job1 => 1, job2 => 1 }, job4 => { job1 => 1, job2 => 1 }, job5 => { job1 => 2, job2 => 2, job4 => 1 }, job6 => { job1 => 2, job2 => 1, jobbc => 1, jobz => 1 }, joba => { job1 => 1, job2 => 1, job4 => 1, jobb => 1 }, jobb => {}, jobbc => {}, jobz => { job1 => 1, job2 => 1, jobbc => 1 }, }