[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Omaha.pm] Sort quickie



I use(d) that functionality to sort tabular data (two-dimensional arrays, or an array hashes)---work(s|ed) well with CGI, allowing user(s) to specify what column to sort on (and hides detail like comparisons of text vs numerals vs dates in the called function). It's about as useful as the Unix "find" utility.

Jay Hannah wrote:


I had a bunch of hash keys that were dates in MMDDYYYY format. I wanted to get a sorted list of the keys. Perl to the rescue! Have y'all configured custom sort subroutines before? They're cool...

The real code in context...
------------
   print "\n\nGroup pickup by cap_date (running total):\n";
   foreach (sort sort_by_cap_date keys %{$group_pickup{by_cap_date}}) {
      my $val = $group_pickup{by_cap_date}{$_};
      next if $val == 0;
      print "$_: $val\n";
   }
}

sub sort_by_cap_date ($$) {
# We have to throw some mojo here since capdate is MMDDYYYY and obviously
   # we can't sort until we turn it into YYYYMMDD... -jhannah 6/14/04
   my ($a, $b) = @_;
   for ($a, $b) {
      s/(\d\d)(\d\d)(\d\d\d\d)/$3$1$2/;
   }
   $a <=> $b;
}
---------------

Same idea, distilled out to see the results easier and so you can play with it:
---------------
my @dates = qw( 05012003 02012004 11012002 );
print join ", ", sort @dates;
print "\n";
print join ", ", sort by_date @dates;
print "\n";

sub by_date ($$) {
   my ($a, $b) = @_;
   for ($a, $b) {
      s/(\d\d)(\d\d)(\d\d\d\d)/$3$1$2/;
   }
   $a <=> $b;
}
----------------

"sort" just does an ASCII sort, which isn't in date order for MMDDYYYY dates. Instead, "sort by_date" does a comparison after converting MMDDYYYY into YYYYMMDD, which does sort dates correctly. It doesn't munge the real values though.

Neat, huh?

perldoc -f sort

j

_______________________________________________
Omaha-pm mailing list
Omaha-pm@pm.org
http://www.pm.org/mailman/listinfo/omaha-pm