my @sorted_by_temp_asc = sort { tricky_sort($a,$b,'T') } @data; sub tricky_sort { my ($A, $B, $field) = @_; my %a_dat = map { split('=', $_, 2) } split(',',$A); my %b_dat = map { split('=', $_, 2) } split(',',$B); return ( $a_dat{$field} <=> $b_dat{$field} ); }