in reply to Hash Math

This will not be as easy as it first appears.   First of all, there is no concept of “previous” or “next” with regards to a hashref.   Also, dates can be difficult to manage as hash-key strings.   So, do you really need for this to be a hash, or will a simple array/list do just as well?

Guessing that the answer to that question is most-likely, “yes,” I suggest that each list-element should be a hashref which contains both the data-record and the associated date ... storing the latter as a date/time object against which math can easily be done.   Now, it is possible to sort that list, using a sort-comparison function that accesses the dates in each record (as the date/time objects that they actually are).   It is then possible to iterate through each element in these lists to do whatever comparative processing might be needed.

For lists of reasonable size (and “reasonable size” can easily be human-large ...), functions like grep are handy for currying through the list and retrieving matching entries.

Replies are listed 'Best First'.
Re^2: Hash Math
by marlowvoltron (Novice) on Jun 09, 2014 at 20:36 UTC

    I have an array for just the dates, I actually zipped together my @dates array and my @tifs array to create the %hash. So if it would be easier doing the math in the array, that's fine, since I have the elements in the hash, I can always reference the hash later to get the tif corresponding to the date.

    So, would I just use each to iterate through my date array to do the necessary comparisons?

      Here is a way to get the difference between the dates in days from an array of dates. (Note that the dates are sorted. If your array isn't sorted you would have some negative differences).
      #!/usr/bin/perl use strict; use warnings; use Time::Piece; my @date = ( '2014-06-01', '2014-06-02', '2014-06-03', '2014-06-04' ); for my $i (0 .. $#date-1) { my $d1 = Time::Piece->strptime($date[$i], '%Y-%m-%d'); for my $j ($i+1 .. $#date) { my $d2 = Time::Piece->strptime($date[$j], '%Y-%m-%d'); my $diff = $d2 - $d1; print $d1->ymd, " and ", $d2->ymd, " is ", $diff->days, "\n"; } }
      Prints
      2014-06-01 and 2014-06-02 is 1 2014-06-01 and 2014-06-03 is 2 2014-06-01 and 2014-06-04 is 3 2014-06-02 and 2014-06-03 is 1 2014-06-02 and 2014-06-04 is 2 2014-06-03 and 2014-06-04 is 1
      Tie::Hash::Indexed maintains an ordered hash. Also, use each only if you're aware of the fact that breaking an iteration partly through the hash means that subsequent iterations will start where it left off. You may be safer with the foreach/keys idiom.

      It may be worth mentioning PDL if you're going to be doing math stuffs with complex data structures. But it might be a bit overkill for your application.