my @temp=qw(a_1 b_1 a_2 a_3 a_4 e_2 a_5 b_3 a_6 b_4); my %router; @router{'a'..'e'} = \(my (@a, @b, @c, @d, @e)); my $keys = join '', keys %router; foreach my $value (@temp) { push @{$router{$1}}, $2 if $value =~ /([$keys])_(.*)/; } print "@a <==> @b, @e\n";