my %targets = map {/(.*)/; ($1, 1)} ; my @neighbours = @domain1[grep {$_ > 0 && $targets{$domain[$_-1]} || $_ < $#domain1 && $targets{$domain[$_+1]}} 0..$#domain]; #### my %neighbours; for (my $i = 0; $i < @domain1; $i++) { push @{$neighbours{$domain[$i]}}, $neighbours{$domain[$i-1]} if $i > 0; push @{$neighbours{$domain[$i]}}, $neighbours{$domain[$i+1]} if $i < $#domain1; } my @neighbours = map {@$_} @neighbours{map {/(.*)/; $1} };