#!/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 .= "
";
	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 .= "
"; } if ($t eq 'insert') { insert_record(param('name'), param('addr'), param('phone')); print "
Record Added or updated!
"; } if ($t eq 'delete') { $o = param('sropt'); $output .= "
";
	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
"; } print <