#!/usr/bin/perl
use CGI ":standard";
print header;
$fileName = "file.txt";
sub trim
{
my $string = shift;
for ($string)
{
s/^\s+//;
s/\s+$//;
}
return $string;
}
sub readFile
{
my $data;
open F, "< $_[0]" or die "Can't open $_[0]: $!\n";
sysread F, $data, -s $_[0]; # read uptil full filesize
close F;
$data =~ s/\015?\012/\n/g; # perl portable best practice
if ($_[1] == 0) {
return split '\n', $data; # return lines
} else {
return $data; # return scalar string
}
}
sub writeFile
{
open F, ">$_[2] $_[0]" or die "Can't open $_[0]: $!\n";
syswrite F, $_[1]; # write entire scalar
close F;
}
sub search_by_name
{
my @results;
my @lines = readFile($fileName); # read line by line
if ($_[0] =~ /\+(.*)\+$/) { # exact mode
foreach(@lines)
{
if (lc($1) eq lc(trim((split /;/, $_)[0]))) { # trim and compare
push @results, $_;
}
}
} else { # boolean AND mode
$. = join '', map "(?=.*\Q$_\E)", split ' ', $_[0]; # lookahead assertion for all words
foreach(@lines)
{
if ($_ =~ /$./i) {
push @results, $_; # build result set
}
}
}
return sort @results; # sorted lexically, return
}
sub search_by_number
{
my @results;
my @lines = readFile($fileName); # read line by line
foreach(@lines)
{
if ($_[0] eq trim((split /;/, $_)[2])) {
push @results, $_; # build result set
}
}
return sort @results; # sort lexically, return
}
sub delete_by_name
{
my @results = search_by_name("+$_[0]+"); # get exact records
if (scalar(@results) < 1) { return; }
my $data = readFile($fileName, 1); # read file as a string
foreach(@results)
{
$data =~ s/\Q$_\E\015?\012//xgis; # remove the string plus a newline
}
writeFile($fileName, $data); # write the file back
}
sub delete_by_number
{
my @results = search_by_number($_[0]); # get matching records
if (scalar(@results) < 1) { return; }
my $data = readFile($fileName, 1); # read file as a string
foreach(@results)
{
$data =~ s/\Q$_\E\015?\012//xgis; # remove the string plus a newline
}
writeFile($fileName, $data); # write the file back
}
sub insert_record
{
delete_by_name($_[0]); # if name exists, delete it
writeFile($fileName, "$_[0]; $_[1]; $_[2];\n", ">"); # append record
}
my $t = param('type');
my $output;
if ($t eq 'search') {
$o = param('sropt');
$output .= "<pre>";
if ($o eq 'name') {
@results = search_by_name(param('q'));
}
if ($o eq 'number') {
@results = search_by_number(param('q'));
}
foreach(@results)
{
$output .= "$_\n";
}
if (scalar(@results) < 1) { print "No results found!"; }
$output .= "</pre>";
}
if ($t eq 'insert') {
insert_record(param('name'), param('addr'), param('phone'));
print "<pre>Record Added or updated!</pre>";
}
if ($t eq 'delete') {
$o = param('sropt');
$output .= "<pre>";
if ($o eq 'name') {
delete_by_name(param('q'));
}
if ($o eq 'number') {
delete_by_number(param('q'));
}
$output .= "Delete done, if there was a record</pre>";
}
print <<endbody;
$output
endbody
print end_html;