#! perl use strict; use warnings; use Data::Dump; my %intervals = ( so => { "10,20" => 0, "30,40" => 0, }, ge => { "10,30" => 0 }, ); while (my $line = ) { my ($id, $num, $datum) = split /\s+/, $line; for my $interval (keys %{ $intervals{$id} }) { my ($min, $max) = split /,/, $interval; if ($num >= $min && $num <= $max) { $intervals{$id}->{$interval} += $datum; } } } dd \%intervals; __DATA__ so 10 0.05 so 11 0.03 so 25 0.15 so 35 0.3 so 36 0.25 so 37 1 ge 14 0.12 ge 20 0.4 #### 12:41 >perl 1037_SoPW.pl { ge => { "10,30" => 0.52 }, so => { "10,20" => 0.08, "30,40" => 1.55 }, } 12:41 >