Sort::Key::Multi - simple multikey sorts


Sort-Key documentation Contained in the Sort-Key distribution.

Index


Code Index:

NAME

Top

Sort::Key::Multi - simple multikey sorts

SYNOPSIS

Top

    use Sort::Key::Multi qw(sikeysort);
    my @data = qw(foo0 foo1 bar34 bar0 bar34 bar33 doz4)
    my @sisorted = sikeysort { /(\w+)(\d+)/} @data;

DESCRIPTION

Top

Sort::Key::Multi creates multikey sorting subroutines and exports them to the caller package.

The names of the sorters are of the form xxxkeysort or xxxkeysort_inplace, where xxx determines the number and types of the keys as follows:

+ i indicates an integer key, u indicates an unsigned integer key, n indicates a numeric key, s indicates a string key and l indicates a string key that obeys locale order configuration.

+ Type characters can be prefixed by r to indicate reverse order.

+ A number following a type character indicates that the key type has to be repeated as many times (for instance i3 is equivalent to iii and rs2 is equivalent to rsrs).

+ Underscores (_) can be freely used between type indicators.

For instace:

   use Key::Sort::Multi qw(iirskeysort
                           i2rskeysort
                           i_i_rs__keysort
                           i2rs_keysort);

exports to the caller package fourth identical sorting functions that take two integer keys that are sorted in ascending order and one string key that is sorted in descending order.

The generated sorters take as first argument a subroutine that is used to extract the keys from the values which are passed inside $_, for example:

  my @data = qw(1.3.foo 1.3.bar 2.3.bar 1.4.bar 1.7.foo);
  my @s = i2rs_keysort { split /\./, $_ } @data;

SEE ALSO

Top

For a more general multikey sorter generator see Sort::Key::Maker.

COPYRIGHT AND LICENSE

Top


Sort-Key documentation Contained in the Sort-Key distribution.

package Sort::Key::Multi;

our $VERSION = '1.25';

use warnings;
use strict;

use Sort::Key qw(multikeysorter multikeysorter_inplace);

use Carp;
our @CARP_NOT = qw(Sort::Key);

my %sub;
my %type = qw( i integer
	       u unsigned_integer
	       n number
	       s string
	       l locale);

my $one_char_types = join('', keys %Sort::Key::mktypes);

sub import {
    shift;
    for my $name (@_) {
	my $sub = $sub{$name};
	unless (defined $sub) {
	    my ($types, $inplace) = $name =~ /^((?:r?[$one_char_types]\d*_*)+)keysort((?:_?inplace)?)$/o
		or croak "invalid name for multikey sorter '$name'";
	    my @types;
	    while ($types =~ /(r?)(.)(\d*)_*/g) {
		my ($r, $t, $n) = ($1, $2, $3);
		push @types, ( ($r ? '-' : '') . $type{$t} ) x ($n || 1);
	    }
	    # print STDERR "$types => @types\n";
	    if ($inplace) {
		$sub = multikeysorter_inplace(@types);
	    }
	    else {
		$sub = multikeysorter(@types);
	    }
	}
	my $caller = caller;
	no strict 'refs';
	*{$caller."::".$name} = $sub;
    }
}

1;