@data = ( 'buy 1/23/01 100 12.625 50 25.25', 'buy 09/1/01 100 12.625 50 25.25', 'buy 10/23/01 100 12.625 50 25.25', 'buy 10/25/01 100 12.625 50 25.25', ); #### sub get_date { my $string = shift; my $date = (split ' ', $string)[1]; # second field return $date; #### for $line (@data) { push @dates, get_date($line); } #### for $line (@data) { push @dates, [ get_date($line), $line ]; } #### sub get_date { my $string = shift; my $date = (split ' ', $string)[1]; my ($d, $m, $y) = split '/', $date; return sprintf "%02d%02d%02d", $y, $m, $d; } #### @dates = sort { $a->[0] <=> $b->[0] } @dates; #### @data = map $_->[1], @dates; #### @data = restore( sort { $a->[0] <=> $b->[0] } extract(@data) ); #### # extract(@data) # becomes map [ get_date($_), $_ ], @data #### # restore(...) # becomes map $_->[1], ... #### @data = map $_->[1], sort { $a->[0] <=> $b->[0] } map [ get_date($_), $_ ], @data; #### @data = map { restore($_) } sort { ... } map { extract($_) } @data;