use Data::Dumper; my $delim = 'A -3 C -4 B'; my $array = ['A -4 A','A -1 C','C -4 D','D -4 B','B -3 C','C -2 B','B -1 E']; get_delim_region($delim,$array); sub get_delim_region{ my ($delim,$array) = @_; my $delim_reg = decomp_str($delim); # I'm really stuck from here..... my @instances; OUT: foreach my $delim_rg ( @{$delim_reg} ){ my @delimreg; my $st1 = (split(" ",$delim_rg))[0]; my $st2 = (split(" ",$delim_rg))[2]; IN: foreach my $i ( 0 .. @{$array}-1 ){ my $tr1 = (split(" ",$array->[$i]))[0]; my $tr2 = (split(" ",$array->[$i]))[2]; if($st1 eq $tr1){ push @delimreg,$array->[$i]; } elsif($st2 eq $tr2){ push @delimreg,$array->[$i]; next OUT; } push @instances, [ @delimreg ]; } } print Dumper \@instances; return ; } sub decomp_str{ # This subroutine decompose a string into sub-regions i.e # from: $delim = 'A -3 C -4 B'; # into: $delim_reg = ['A -3 C','C -4 B']; # Credit Roy Johnson - fastest [$_[0] =~ /(?=([a-z]\s*(?:\S+\s*){2}))\S+\s*/gi ] }