### INIT pragma use strict; use warnings; ### INIT vars my $data_table = []; my @aLines = (); ### MUNGE raw data into a table @{$data_table} = map{ my @aFlds = split /\s*-\s*|\s*,\s*/,$_; if(scalar @aFlds != 3){die"ERROR: bad data"} chomp$aFlds[2]; {fld0 => $aFlds[0], fld1 => $aFlds[1], fld2 => $aFlds[2],}; }@aLines; ### SORT the table or do whatever else you want ### See Also 4.15. Sorting a List by Computable Field, Perl Cookbook ### By Tom Christiansen & Nathan Torkington; ISBN 1-56592-243-3 my @ordered = sort { $a->{fld2} cmp $b->{fld2} } @{$data_table}; map{print "$_->{fld0} ;;; $_->{fld1} ;;; $_->{fld2}\n"}@ordered; __DATA__ Item3 - 1 foo, 3 bar Item1 - 2 foo, 2 bar Item4 - 1 foo, 2 bar Item2 - 0 foo, 1 bar