> Seems related to, and an extension of, Time::Duration. > Perhaps you could extend that module rather than create a new one. Yes, really were addressing the same problem. However, Time::Duration doesn't output the time numbers separately, instead, it throws a "static" string written in english saying the results. I don't think this is adequate.
Maybe extending this module would be a good idea... i'll read it. Regards, bruno. > Tim. > > > Using my module, the following test code: > > > > use strict; > > my $seconds = 31556931; > > foreach ('MINS', 'HOURS', 'DAYS', 'MONTHS', 'YEARS') { > > my $s = new GroupedBy ( $_ ); > > my ($secs, $mins, $hours, $days, $months, $years) = > > $s->calculate($seconds); > > print "Grouping by $_, $seconds seconds are:\n ", > > " $years years, $months months, $days days, $hours > > hours,", > > " $mins mins, $secs seconds.\n\n"; > > } > > > > Will bring this output: > > > > Grouping by MINS, 31556931 seconds are: > > 0 years, 0 months, 0 days, 0 hours, 525948 mins, 51 seconds. > > > > Grouping by HOURS, 31556931 seconds are: > > 0 years, 0 months, 0 days, 8765 hours, 48 mins, 51 seconds. > > > > Grouping by DAYS, 31556931 seconds are: > > 0 years, 0 months, 365 days, 5 hours, 48 mins, 51 seconds. > > > > Grouping by MONTHS, 31556931 seconds are: > > 0 years, 12 months, 5 days, 5 hours, 48 mins, 51 seconds. > > > > Grouping by YEARS, 31556931 seconds are: > > 1 years, 0 months, 0 days, 0 hours, 0 mins, 1 seconds. > > > > The draft code of the module is bellow, > > > > package GroupedBy; > > sub new { > > my $class = shift; > > my $self = {}; > > bless ( $self, $class ); > > my $GroupedBy = shift; > > # Amount of Seconds input by the user (set by calculate() method) > > $self->{SECONDS}; > > # Initializing data about years, months, days, hours and minutes; > > $self->{SECS} = { result => 0 }; > > # A minute is 60 seconds > > $self->{MINS} = { inSecs => 60, opId => 1, took => 0, result => 0 }; > > # An hour is 60 * 60 seconds > > $self->{HOURS} = { inSecs => 3600, opId => 2, took => 0, result => 0 }; > > # A day is 60 * 60 * 24 seconds > > $self->{DAYS} = { inSecs => 86400, opId => 3, took => 0, result => 0 }; > > # A month is 60 * 60 * 24 * 30 seconds > > $self->{MONTHS} = { inSecs => 2592000, opId => 4, took => 0, result => 0 }; > > # Year is 60 * 60 * 24 * 365.24225 = 31556930.4 seconds (we'll ignore 0.4 secs) > > $self->{YEARS} = { inSecs => 31556930, opId => 5, took => 0, result => 0 }; > > > > # OPID - operation ID, is a number indentifying the kind of grouping that > > # was chosen by the user. Each grouping requires a diferent operation to > > # calculate the resulting values. > > $self->{OPID} = $self->{$GroupedBy}->{opId}; > > die "Unvalid value. Valid values are 'MINS', 'HOURS', 'DAYS', 'MONTHS', 'YEARS'" > > unless defined $self->{OPID}; > > > > return $self; > > } > > > > sub calculate { # returns: Array: the results of the calculus > > my $self = shift; > > $self->{SECONDS} = shift; > > $self->_clean(); > > my @result = ( $self->_years(), $self->_months(), $self->_days(), > > $self->_hours(), $self->_mins(), $self->_secs() ); > > return reverse @result; > > } > > > > sub groupedBy { # returns: String: the current GROUPED_BY type > > my $self = shift; > > my $GroupedBy = shift; > > $self->{OPID} = $self->($GroupedBy)->{opId}; > > die "Unvalid value. Valid values are 'MINS', 'HOURS', 'DAYS', 'MONTHS', 'YEARS'" > > unless defined $self->{OPID}; > > return $GroupedBy; > > } > > > > # Cleans(set to 0)the 'took' and 'result' counters for all groups > > sub _clean { # returns: nothing > > my $self = shift; > > foreach ( qw ( SECS MINS HOURS DAYS MONTHS YEARS ) ) { > > $self->{$_}->{took} = 0; > > $self->{$_}->{result} = 0; > > } > > } > > > > sub _secs { # returns: Integer: the result > > my $self = shift; > > my $name = "SECS"; > > $self->{$name}->{result} = $self->{SECONDS} - $self->{YEARS}->{took} > > - $self->{MONTHS}->{took} - $self->{DAYS}->{took} - $self->{HOURS}->{took} > > - $self->{MINS}->{took}; > > return $self->{$name}->{result}; > > } > > > > sub _mins { # returns: Integer: the result > > my $self = shift; > > my $name = "MINS"; > > if ( $self->{OPID} >= 1 ) { > > my $secsLeft = $self->{SECONDS} - $self->{YEARS}->{took} > > - $self->{MONTHS}->{took} - $self->{DAYS}->{took} - $self->{HOURS}->{took}; > > $self->{$name}->{result} = int($secsLeft / $self->{$name}->{inSecs}); > > if ( $self->{$name}->{result} != 0 ) { > > $self->{$name}->{took} = $self->{$name}->{result} * $self->{$name}->{inSecs}; > > } > > } > > return $self->{$name}->{result}; > > } > > > > sub _hours { # returns: Integer: the result > > my $self = shift; > > my $name = "HOURS"; > > if ( $self->{OPID} >= 2 ) { > > my $secsLeft = $self->{SECONDS} - $self->{YEARS}->{took} > > - $self->{MONTHS}->{took} - $self->{DAYS}->{took}; > > $self->{$name}->{result} = int($secsLeft / $self->{$name}->{inSecs}); > > if ( $self->{$name}->{result} != 0 ) { > > $self->{$name}->{took} = $self->{$name}->{result} * $self->{$name}->{inSecs}; > > } > > > > } > > return $self->{$name}->{result}; > > } > > > > sub _days { # returns: Integer: the result > > my $self = shift; > > my $name = "DAYS"; > > if ( $self->{OPID} >= 3 ) { > > my $secsLeft = $self->{SECONDS} - $self->{YEARS}->{took} - > > $self->{MONTHS}->{took}; > > $self->{$name}->{result} = int($secsLeft / $self->{$name}->{inSecs}); > > if ( $self->{$name}->{result} != 0 ) { > > $self->{$name}->{took} = $self->{$name}->{result} * $self->{$name}->{inSecs}; > > } > > } > > return $self->{$name}->{result}; > > } > > > > sub _months { # returns: Integer: the result > > my $self = shift; > > my $name = "MONTHS"; > > if ( $self->{OPID} >= 4 ) { > > my $secsLeft = $self->{SECONDS} - $self->{YEARS}->{took}; > > $self->{$name}->{result} = int($secsLeft / $self->{$name}->{inSecs}); > > if ( $self->{$name}->{result} != 0 ) { > > $self->{$name}->{took} = $self->{$name}->{result} * $self->{$name}->{inSecs}; > > } > > } > > return $self->{$name}->{result}; > > } > > > > sub _years { # returns: Integer: the result > > my $self = shift; > > my $name = "YEARS"; > > if ( $self->{OPID} == 5 ) { > > $self->{$name}->{result} = int($self->{SECONDS} / $self->{$name}->{inSecs}); > > if ( $self->{$name}->{result} != 0 ) { > > $self->{$name}->{took} = $self->{$name}->{result} * $self->{$name}->{inSecs}; > > } > > } > > return $self->{$name}->{result}; > > } > > > > Any suggestions? Opinions? questions? etc.... > > > > A hug for everybody, > > Bruno Negrão > > > > > > > > > > >