use strict; use Date::Calc qw(:all); use Data::Dumper; my $rates = [ ['01/01/1990', '09/01/2003', 105], ['08/01/2003', '10/01/2003', 190], ['10/01/2003', '01/01/2007', 140], ]; my $new_rates = initrates($rates); # print Dumper($new_rates); my %date = ( '07/01/2003', 20, # date, no. user '09/01/2003', 10, '10/01/2003', 20, '12/12/2003', 12); foreach (sort keys %date) { my $rate = getdailyrate($_); my $per_user = sprintf "%.2f", $rate / $date{$_}; print "Daily rate for $_ is $rate, $date{$_} users, every user pay \$$per_user\n"; } # date in dd/mm/yy sub getdailyrate { my $datestr = shift; my ($y, $m, $d) = getymd($datestr); my $date = Mktime($y, $m, $d, 0, 0, 0); foreach(@$new_rates) { return $_->[3] if $date >= $_->[0] && $date < $_->[1]; } return(0); } sub initrates { my $rates = shift; my @rates; foreach (@$rates) { my ($y1, $m1, $d1) = getymd($_->[0]); my ($y2, $m2, $d2) = getymd($_->[1]); my $total = $_->[2]; my $dd = Delta_Days($y1,$m1,$d1,$y2,$m2,$d2); my $rate = sprintf "%.02f", $total / $dd; # print "$dd days - wanted $total - rate \$$rate per day\n"; my $t1 = Mktime($y1, $m1, $d1, 0, 0, 0); my $t2 = Mktime($y2, $m2, $d2, 0, 0, 0); push @rates, [ $t1, $t2, $total, $rate ]; } return \@rates; } sub getymd { my $datestr = shift; my ($day, $mon, $year) = $datestr =~ m[(\d+)/(\d+)/(\d+)]; # or Parse_Date return ($year, $mon, $day); }