search script

in my data file = name|age|gender|description
in my search form , they can search in 3 fields : age, gender and description

can someone pls teach mi how to do a search script so tat a user only needs to search using any one(mininum) of the field ? for example..if he fills in the age form only , all the data with age similar to the form age value will be the result. And if he fills in the age and the description form, all data that meets both the age and description criteria will be the result.
Who is Participating?
jyu_88Connect With a Mentor Commented:
something like the following should do.
The following snippet used exact match for each of the criteria. If a range shall be allowed for comparison, modify the comparison accordingly.

#! /usr/bin/perl -w

my ($age, $gender, $descr, $i, $isMatched);

my (@fields, @ages, @genders, @descrs);

# matched list of line numbers.
my @matches = ();

my $datafile = "./datafile1";
open DATAFILE, "<$datafile" or die "failed to open $datafile to read: $!";

# read the datafile into 3 arrays.
while(<DATAFILE>) {
      @fields = split /|/;
      push @ages, $fields[0];
      push @genders, $fields[1];
      push @descrs, $fields[2];
close (DATAFILE);

# get criteria variables assigned with values from Form feedback: $age, $gender and $descr, if necessary.
# use the simplest
# you know how to use, right?

# if none is defined, then quit here.
die "Error: You have to specify at least on searching criteria\n" } unless (defined $age or defined $gender or defined $descr)

foreach $i (0..$#ages) {
      #init with 'notMatch'
      $isMatched = 1;
      # if $age given, check it.
      if (defined $age) {
      if ($age == $ages[$i]) {$isMatched = 0}
      else { next }
      # if gender given, check it.
      if (defined $gender) {
      if ($gender eq $genders[$i]) {$isMatched = 0}
      else { next }

      # if descr given, check it.
      if (defined $descr) {
      if ($descr eq $descrs[$i]) {$isMatched = 0}
      else { next }
      # Done checking. If the final result for line $i is good, add index $i into matched list.
      push @matches, $i if (0 == $isMatched);
# end of check all lines

# print out all matches.
if ( -1 == $#matches) {
      print "Sorry, none matched\n"
else {
      foreach $i (@matches) {
            print "matched: $ages[$i] $gender[$i] $descrs[$i]\n";

exit 0;


prinxAuthor Commented:
thanx ;>
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.