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" );