use strict; use Data::Dump qw( dump ); my %hash = ( inst => { dept => { rollno=> { name => 100, name1 => 90 , name2 => 30 , name3 => 99 } } } ); my @all_insts = keys %hash; my @all_deps; foreach my $single_inst ( @all_insts ) { push @all_deps, keys %{ $hash{ $single_inst } }; } my @all_roll_nos; foreach my $single_inst ( @all_insts ) { foreach my $single_dep ( @all_deps ) { push @all_roll_nos, keys %{ $hash{ $single_inst }->{ $single_dep } }; } } my @all_names; foreach my $single_inst ( @all_insts ) { foreach my $single_dep ( @all_deps ) { foreach my $single_roll_no ( @all_roll_nos ) { push @all_names, keys %{ $hash{ $single_inst }->{ $single_dep }->{ $single_roll_no } }; } } } my @all_marks ; foreach my $single_inst ( @all_insts ) { foreach my $single_dep ( @all_deps ) { foreach my $single_roll_no ( @all_roll_nos ) { foreach my $single_name ( @all_names ) { push @all_marks, $hash{ $single_inst }->{ $single_dep }->{ $single_roll_no }->{ $single_name }; } } } } my @sorted_marks = sort( { $a <=> $b } @all_marks ); dump( @sorted_marks );