Data-Sorting
view release on metacpan or search on metacpan
defined $ValueSet[$b] or $ValueSet[$b] = _extract_value($Array[$b], $Rule);
# If the function returns zero or undef, the values are equivalent
my $rc = &{ $Rule->{compare_func} }
or next RULE;
# Else return the comparison results, reversing them first if necessary
return $rc * $Rule->{order_sign};
}
# If the items are equivalent for all of the rules, don't change their order
# warn "Comparing $a and $b: '$ValueSet[$a]' " . ('=') . " '$ValueSet[$b]'\n";
return $a <=> $b;
}
sub _sorted_packed {
my @packed;
if ( @Rules == 1 ) {
@packed = map
&{ $Rules[0]->{extract_func} }( $Array[$_], @{ $Rules[0]->{extract_args} } )
. "\0" . $_,
( 0 .. $#Array );
} else {
@packed = map {
my $item = $Array[$_];
join( "\0",
map(&{ $_->{extract_func} }( $item, @{ $_->{extract_args} } ), @Rules),
$_
)
} ( 0 .. $#Array );
}
# warn "Packed: " . join(', ', map "'$_'", @packed ) . "\n";
return @Array[ map substr($_, 1 + rindex $_, "\0"), sort @packed ];
}
########################################################################
=head1 STATUS AND SUPPORT
This release of Data::Sorting is intended for public review and feedback.
Name DSLIP Description
-------------- ----- ---------------------------------------------
Data::
::Sorting bdpfp Multi-key sort using function results
Further information and support for this module is available at www.evoscript.org.
Please report bugs or other problems to E<lt>bugs@evoscript.comE<gt>.
=head1 BUGS AND TO DO
The following issues have been noted for future improvements:
Convert more types of comparisons to packed-default sorts for speed.
Further investigate the current status of the Sort::Records module.
Add a comparator function for an alpha-numeric-spans sorting model
like Sort::Naturally.
Interface to Sort::PolySort for alternate comparator styles, like
"name" and "usdate".
For non-scalar values, compare referents along the lines of
Ref::cmpref().
Provide better handling for nested sorts; perhaps throw an exception
from the inner instance to the outer, catch and set $PreCalculate,
then go back into the loop?
Replace dynamic scoping with object instances for thread safety.
May not be necessary given changes in threading models.
=head1 CREDITS AND COPYRIGHT
=head2 Developed By
M. Simon Cavalletto, simonm@cavalletto.org
Evolution Softworks, www.evoscript.org
=head2 Copyright
Copyright 2003 Matthew Cavalletto.
Portions copyright 1996, 1997, 1998, 1999 Evolution Online Systems, Inc.
=head2 License
You may use, modify, and distribute this software under the same terms as Perl.
=cut
########################################################################
1;
( run in 2.192 seconds using v1.01-cache-2.11-cpan-e93a5daba3e )