bookpicker


#!/usr/bin/perl -w
#
# bookpicker -- pick a book from the top of one or more reading lists
# 	at random, weighted by the length of each list.
#

use strict;

my $listdir = "$ENV{'HOME'}/lib/reading_lists";    # list directory
my @lists;                                         # list filenames
my $totlines;      # total number of books in all lists
my %lines;         # book count in each list
my $r;             # random value
my $line;          # line from list
my $list;          # each list filename
my $pickedlist;    # chosen list filename

#
# find all list files...
#
opendir( LD, $listdir ) || die "Can't open $listdir: $!\n";
@lists = sort grep { /\.list$/ } readdir(LD);
closedir(LD);

#
# count lines in list files...
#
$totlines = 0;
foreach $list (@lists) {
    $lines{$list} = 0;
    open( LF, "<$listdir/$list" );
    while (<LF>) {
        $lines{$list}++;
    }
    close(LF);
    $totlines += $lines{$list};
}

#
# choose a random list weighted by its length...
#
$r = int rand $totlines;
foreach $list (@lists) {
    if ( $r <= $lines{$list} ) {
        $pickedlist = $list;
        last;
    }
    $r -= $lines{$list};
}

#
# extract and remove first book from chosen list
#
open( LF,  "<$listdir/$pickedlist" );
open( NLF, ">$listdir/$pickedlist.new" );
chomp( $line = <LF> );
print "I pick: $line\n";
while (<LF>) {
    print NLF $_;
}
close(LF);
close(NLF);
rename( "$listdir/$pickedlist",     "$listdir/$pickedlist.old" );
rename( "$listdir/$pickedlist.new", "$listdir/$pickedlist" );