use autobox; my @nums = 1->to(10); my @reverse = 10->to(1); #### package SCALAR; sub to { my ($from, $to) = @_; return $from > $to ? (reverse $to .. $from) : ($from .. $to); } 1; #### my @data = ( 'test12-05-2003this', 'test11-05-2003this', 'test12-06-2003this', 'test12-05-2000this', ); @data = schwartzian(@data); print Dumper \@data; sub schwartzian { # do I *really* have to use strings here? :( my $result = [@_] ->map ('[$_,main::get_date($_)]') ->sort('$a->[1] <=> $b->[1]') ->map ('$_->[0]'); return @$result; } sub get_date { my ($month,$day,$year) = shift =~ /(\d+)-(\d+)-(\d+)/; return "$year$month$day"; } #### package ARRAY; sub grep { [eval "grep {$_[1]} \@{\$_[0]}"] } sub map { [eval "map {$_[1]} \@{\$_[0]}"] } sub sort { [eval "sort {$_[1]} \@{\$_[0]}"] } # reverse is not used in this example sub reverse { [reverse @{$_[0]} ] } 1;