NAME

POSIX::bsearch - supplies (and extends) a function missing from the POSIX module

SYNOPSIS

bsearch(\&SortFunc,$key,@SortedTable) returns a possibly empty list of all elements from the sorted list matching $key according to the sort function.

In scalar context, the first matching element located is returned and the $POSIX::bsearch::count variable is left alone.

use POSIX::bsearch;
sub SortFunc {
   $a->{lastname} cmp $b->{lastname} or
   $a->{firstname} cmp $b->{firstname}
}
my @SortedList = sort SortFunc GetRecords();
for ( bsearch
    \&SortFunc   # a block would work too
    { lastname => 'Strummer', firstname => 'Joe' },  # key record
    @SortedList, # uses \@ prototype
){
    $_->{city} eq 'London' and $_->PrintRecord
};
print "Found $POSIX::bsearch::count ";
print "Joes Strummer starting at index $POSIX::bsearch::index\n";

DESCRIPTION

Generally, in Perl, you don't need bsearch as we prefer to keep our data in hash tables rather than in sorted lists. So the POSIX module explicitly does not supply a bsearch function.

But here one is. In case you want, for instance, a range of consecutive records.

The function takes three arguments, a comparison function, a key, and a sorted array. Side effects include setting the $POSIX::bsearch::count and $POSIX::bsearch::index variables.

Results and behavior are not defined when applying this function to a list that is not sorted congruently with the provided comparison function. You might get a TABLE NOT SORTED exception, you might get results.

POSIX SEMANTICS

Call bsearch in scalar context to get any matching element.

EXTENDED SEMANTICS

Call bsearch in list context to trigger the extended semantics. Futher exploration of the table is done to find the first and last matching elements. All matching elements are returned in the result set, and two package variables are set.

$POSIX::bsearch::index Set in both scalar and array context, $POSIX::bsearch::index holds the index of the first record that gives a nonnegative comparison result, or -1 when the key is under the 0th element, or the array length when over the last.

$POSIX::bsearch::count

the number of records that give zero comparison result

undefined when called in scalar context

reentrancy

it should be possible to call bsearch within another bsearch's comparison function, although this feature is not explicitly checked in this revision's .t file. The index and count variables will be from the last completed bsearch called in array context.

EXPORT

bsearch

HISTORY

initial version 0.01 written March 4, 2010, in response to a discussion on the perl 5 porters mailng list concerning possible perl uses for bsearch.

version 0.02 edited August 23, 2010, now handles a key that is previous to the first element in the sorted list, also handles larger lists without claiming to be stuck, also sets $POSIX::bsearch::index indicatively when the key is over or under the data range. Stefane Leforestier kindly brought the bug to my attention.

SEE ALSO

look into "Schwarz-Gutman transform" to see the generally recognized best practice for sorting objects by creating a unique string for each object and sorting the strings.

AUTHOR

David Nicol

COPYRIGHT AND LICENSE

Copyright (C) 2010 by David Nicol / Tipjar LLC

This work is licensed under the Creative Commons Attribution 3.0 Unported License. To view a copy of this license, visit http://creativecommons.org/licenses/by/3.0/ or send a letter to Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.

Leaving this section of the documentation in your installed copy of this module intact is sufficient attribution. A source code comment mentioning the POSIX::bsearch module from CPAN is sufficient attribution in derivative works.