#!/usr/bin/perl -w BEGIN { use Cwd 'getcwd'; my $here = Cwd::abs_path; my $root = $here; unshift @INC, "$root/Sort-Maker-0.06"; } use strict; use warnings; use Sort::Maker; use Data::Dumper; # for testing my $ITEM_COUNT = 20; # helper function sub generate_random_string { my $length_of_randomstring = shift; # the length of # the random string to generate my @chars = ( 'a' .. 'z', 'A' .. 'Z' ); my $random_string; foreach ( 1 .. $length_of_randomstring ) { # rand @chars will generate a random # number between 0 and scalar @chars $random_string .= $chars[ rand @chars ]; } return $random_string; } sub testSortByName { # create list of random topic names my $itemCount = $ITEM_COUNT; my @topics = map { generate_random_string( 3 + int rand 10 ) } 1 .. $itemCount; # create plain sorter, sorting case insensitive my $sorter = make_sorter(qw( plain string no_case )); die "make_sorter: $@" unless $sorter; # sort my @sortedTopics = $sorter->(@topics); print "\ntestSortByName\n"; print Dumper @sortedTopics; } sub testSortByKey { # create a list of hashes # each with keys 'name' (string) and 'date' (number) my $itemCount = $ITEM_COUNT; my @topics = map { { name => "Topic$_", date => int rand 1000000 } } 1 .. $itemCount; # create Schwarzian Transform sorter # that consumes and outputs an array reference my $sorter = make_sorter( qw( ST ref_in ref_out ), number => '$_->{date}' ); # sort my $sortedTopicsRef = $sorter->( \@topics ); print "\ntestSortByKey\n"; print Dumper $sortedTopicsRef; } sub testSortByKey2 { # create a list of hashes # each with keys 'name' (string) and 'bug_severity' (string) my $itemCount = $ITEM_COUNT; my @values = qw(severe noncritical critical); my @bugs = map { { name => "Topic$_", bug_severity => $values[ int rand 3 ] } } 1 .. $itemCount; my $sorter = make_sorter( 'ST', name => 'severitySorter', init_code => 'my %lookup = ( critical => 3, severe => 2, noncritical => 1 );', number => [ code => '$lookup{$_->{bug_severity}}' ], ); # sort print "\ntestSortByKey2\n"; print Dumper $_ for severitySorter(@bugs); } sub testByMultipleKeys { # create a list of hashes # each with keys 'name' (string) and 'date' (number) my $itemCount = $ITEM_COUNT; my @topics = map { { name => &generate_random_string(5), date => int rand 3 } } 1 .. $itemCount; # create Schwarzian Transform sorter # with 2 sort keys my $sorter = make_sorter( qw( ST ), number => '$_->{date}', string => { code => '$_->{name}', no_case => 1, } ); # sort my @sortedTopics = $sorter->(@topics); print "\testByMultipleKeys\n"; print Dumper @sortedTopics; } sub testByMultipleKeysGRT { # create a list of hashes # each with keys 'name' (string) and 'date' (number) my $itemCount = $ITEM_COUNT; my @topics = map { { name => &generate_random_string(5), date => int rand 3 } } 1 .. $itemCount; # create Guttman-Rosler Transform sorter # with 2 sort keys my $sorter = make_sorter( qw( GRT ), number => { code => '$_->{date}', unsigned => 1, }, string => { code => '$_->{name}', no_case => 1, varying => 1, } ); # sort my @sortedTopics = $sorter->(@topics); print "\testByMultipleKeysGRT\n"; print Dumper @sortedTopics; } testSortByName(); testSortByKey(); testSortByKey2(); testByMultipleKeys(); testByMultipleKeysGRT();