#!/usr/local/bin/perl -W use strict; my $base; # precio de referencia if (scalar(@ARGV) > 0) { $base = $ARGV[0]; }else{ $base = 100; } print "BASE PRICE = $base\n"; my $r = 2.4; # parámetro a ajustar my $eff_r = $r/365; # use Date::Calc qw(:all); # ($year,$month,$day, $hour,$min,$sec) = Time_to_Date([time()]); # don't works! my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =localtime(time); my $day = $mday; my $month = $mon+1; $year += 1900; print "$year) month $month day $day\n"; my $unused = $sec+$min+$hour+$wday+$yday+$isdst; # Jan Feb Mar Apr May Jun Jul Ago Sep Oct Nov Dec # 1 2 3 4 5 6 7 8 9 10 11 12 my $year1 = 1966; my $month1 = 9; my $day1 = 6; # my $date2 = Date_to_Days($year,$month,$day); # my $date1 = Date_to_Days($year1,$month1,$day1); # my $delta_day = $date2 - $date1; # print "Delta_Days = $delta_day\n"; my $delta_days = delta_days($day1,$month1,$year1,$day,$month,$year); print "Delta_days = $delta_days\n"; # $delta_day = Delta_Days($year,$month,$day, $year1,$month1,$day1); # $delta_day /= 24*60; # this is another thing that don't works if ($delta_days > 0) { $delta_days =0; } if ($delta_days < -30) { $delta_days = -30; } print "Delta_Days efectivo = $delta_days\n"; my $price; for (my $day = 0; $day>=-30; $day--){ $price = $base/exp($day*$eff_r); printf "%d %.2f\n", $day, $price; } # print delta_days(6,9,1966, $day,$month,$year), "\n"; sub delta_days{ my ($d1, $m1, $y1, $d2, $m2, $y2) = @_; my $delta =0; my $ystep =1; $ystep = -1 if $y1>$y2; for (my $i=$y1; $i!=$y2; $i += $ystep) { $delta += (365+leap_year($i))*$ystep; } my $mstep = 1; $mstep = -1 if $m1>$m2; for (my $j=$m1; $j!=$m2; $j += $mstep){ $delta += days_per_month($j)*$mstep; } $delta += ($d2-$d1); return $delta; } sub leap_year { return 0 if $_[0] & 3; return !!($_[0] % 100 || !($_[0] % 400)); } sub days_per_month { my ($m, $y) = @_; return 28 + leap_year($y) if $m == 2; return 30 + (($m & 1) ^ ($m >= 8)); } # print(days_per_month($ARGV[0], $ARGV[1]), "\n"); __END__ En curso, calcula precios crecientes en función de la antelación (hasta 30 días) según una curva exponencial. Pensado para sistemas de reservas.