All pastes #794570 Raw Edit

Mine

public text v1 · immutable
#794570 ·published 2007-11-23 07:48 UTC
rendered paste body
#!/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;