> 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
> >
> >
> >
> >
> >
>

Reply via email to