use warnings; use strict; use Data::Dumper; my @arr = ( [12, "abc", 30], [24, "abc", 30], [26, "abc", 30], [14, "abc", 40], [46, "abc", 40], [2, "abc", 50] ); my %res; map { push @{$res{$_->[2]}}, $_ } @arr; warn Dumper values %res; #### $ perl tst.pl $VAR1 = [ [ 2, 'abc', 50 ] ]; $VAR2 = [ [ 14, 'abc', 40 ], [ 46, 'abc', 40 ] ]; $VAR3 = [ [ 12, 'abc', 30 ], [ 24, 'abc', 30 ], [ 26, 'abc', 30 ] ];