use Data::Dumper; sub getRange { my $value = shift; warn "Unexpected value $value," and return if $value < 1; return '1-19' if $value < 20; return '20-29' if $value < 30; return '30-39' if $value < 40; return '40-59' if $value < 60; warn "Out of range value $value," and return; } my %hits; while () { my $range = getRange($_); $hits{$range}++ if defined $range; } print Dumper \%hits; __DATA__ 12 14 15 20 21 50 42 #### $VAR1 = { '1-19' => 3, '40-59' => 2, '20-29' => 2 };