#!/usr/bin/perl # # Copyright (c) 2002 Steve Slaven, All Rights Reserved. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA # # Builds a walkable dictionary, like a linked list. Start w/ a letter # and that letter has a list of "following" possible letters, # which will then have a list of "following" letters in the new combined key # if a + is in the list, it means this is also a legal end letter to make a word # # like this (abc ab abd bcd): # # db = ( # a => 'b', # ab => 'cd+', # abc => '+', # abd => '+', # b => 'c', # bc => 'd', # bcd => '+' use DB_File; unlink( 'dict.db' ); tie %dict, DB_File, 'spelldown.db'; # hot.... grits? $| = 1; $cnt = 0; while( <> ) { chomp(); s/#.*$//; #$_ = lc( $_ ); # Only good entries next unless $_; # no blanks next if $_ =~ /[^a-z]/; # all letters (lowercase only, no names or junk like that) @letters = split( //, $_ ); $this_word = shift( @letters ); for( @letters ) { #print "$this_word -> $_\n"; $dict{ $this_word } .= $_ unless $dict{ $this_word } =~ /$_/; $this_word .= $_; } $dict{ $this_word } .= '+' unless $dict{ $this_word } =~ /\+/; if( $cnt++ % 100 == 0 ) { print "\b" x 20; printf '%6d records', $cnt; } } print "\n";