#!/usr/local/bin/perl # Jaime Prilusky, 2012 use GDBM_File ; use Term::ReadLine; my $phoneDB = "./phonesDB"; local(*HIST); # binds a GDBM file to a hash tie %HIST, 'GDBM_File', $phoneDB, GDBM_WRCREAT, 0640; # creates a Term::ReadLine object $term = new Term::ReadLine 'PhonesDB'; $prompt = "Phones >"; $OUT = $term->OUT || STDOUT; # get input from user until 'q' while ( defined ($command = $term->readline($prompt)) ) { last if ($command eq "q"); if ($command eq "d") { dumpAllData(); } elsif ($command eq "e") { enterData(); } elsif ($command eq "s") { searchDatabase(); } else { giveUsage(); } $term->addhistory($_) if /\S/; } # breaks the binding between a DBM file and a hash untie %HIST ; sub searchDatabase { my $name = $term->readline("search for name"); if (!defined $HIST{$name}) { print "[$name] unknown\n"; } else { ($name,$address) = split(/\t/,$HIST{$name}); print "$name\t$phone\t$address\n"; } } sub enterData { print "\nEnter new data\n"; my $name = $term->readline("Name "); my $phone = $term->readline("Phone "); my $address = $term->readline("Address"); $HIST{$name} = join("\t",$phone,$address); return; } sub giveUsage { print qq{ Phones Database commands: q Save and Quit d Dump all data e Enter new data s Search database }; } sub dumpAllData { my $numOfRecords = scalar (keys %HIST); if (!$numOfRecords) { print "Database empty\n"; } else { $s = ($numOfRecords == 1) ? "" : "s"; print "Your database contains $numOfRecords record$s\n"; while (($key,$val) = each %HIST) { print "$key\t$val\n"; } } return; } # suggestions as exercise: # display number of available records on the 'd Dump all data' usage line # use regexp when retrieving data from database # warn if name already in database before changing current phone or address # dump all data matching partial name # dump data sorted by name, phone or address