Perl search multiple fields

Hi all,

I have a flatfile 300 lines

tiger,tampa10-pc,yellow,none,2013-02-25 08:56:51.000,2013-02-25 21:41:11.380,12hrs : 44min
cat,tampa10-pc,white,none,2013-02-28 08:56:58.000,2013-03-04 23:18:23.003,110hrs : 21min
dog,tampa10-pc,yellow,none,2013-03-05 09:50:17.000,2013-03-07 00:08:02.617,38hrs : 17min
dog,tampa10-pc,yellow,Trainned,2013-02-24 00:00:00.000,2013-02-24 22:34:10.293,22hrs : 34min
dog,sanjose10-pc,yellow,Trainned,2013-02-24 22:34:32.000,2013-02-25 08:56:58.743,10hrs : 22min
dog,sanjoseis10-pc,yellow,Unknown,2013-02-25 21:40:21.000,2013-02-27 00:17:36.007,26hrs : 37min
dog,sanjose10-pc,yellow,Unknown,2013-02-27 00:17:57.000,2013-02-28 00:19:35.340,24hrs : 01min
dog,denver10-pc,black,Unknown,2013-02-28 00:19:38.000,2013-02-28 08:57:12.103,8hrs : 37min
dog,denver10-pc,black,Trainned,2013-03-04 23:18:16.000,2013-03-05 09:50:25.500,10hrs : 32min
dog,denver12-pc,yellow,Unknown,2013-03-07 00:07:51.000,2013-03-13 00:04:35.213,143hrs : 56min
dog,denver10-pc,yellow,Unknown,2013-03-13 00:04:48.000,2013-03-14 01:24:15.437,25hrs : 19min
dog,denver12-pc,yellow,Unknown,2013-03-14 01:24:37.000,2013-03-15 10:23:17.503,32hrs : 58min

I created a basic html form:

 <html><head> <TITLE>Search </TITLE>
 <script language="javascript" type="text/javascript" src="./applets/datetimepicker_css.js">
</script>
</head>

 <body>
<center><h1>Search</h1></center>
<hr WIDTH="80%">
<FORM METHOD="POST" ACTION="search.pl">
<table  border=0 WIDTH="80%"cellspacing=4 cellpadding=3 bordercolor="#FFCC00" style="background-color:#FFFFCC">
 <tr >
  <td >
  Start Date:
  </td>
  <td >
<input type="text" id="startdate" size="16"> <img src="./images/cal.gif" width="16" height="16" border="0" onclick="javascript:NewCssCal('startdate','yyyyMMdd')" style="cursor:pointer"/>
  </td>
  <td >
  End Date:
  </td>

  <td >
<input type="text" id="enddate" size="16"> <img src="./images/cal.gif" width="16" height="16" border="0" onclick="javascript:NewCssCal('enddate','yyyyMMdd')" style="cursor:pointer"/>
  </td>
 </tr>
 <tr >
  <td >
  Animal
  </td>

  <td >
 Location:
  </td>
  <td >
  Color:
  </td>
  <td >
  Trainning:
  </td>
 </tr>
 <tr >

  </td>
  <td >
  <SELECT NAME="animal" SIZE="1">
    <OPTION SELECTED>all
    <OPTION>tiger
     <OPTION>cat
    <OPTION>dog
    
</SELECT>
  </td>
  <td >
  <SELECT NAME="location" SIZE="1">
  <OPTION SELECTED>all
  <OPTION>tampa
   <OPTION>sanjose
  <OPTION>denver
</SELECT>
  </td>
  <td>
<SELECT NAME="color" SIZE="1">
  <OPTION SELECTED>all
  <OPTION>black
   <OPTION>yellow
  <OPTION>white

</SELECT>
  </td>
    </td>
    <td>
  <SELECT NAME="training" SIZE="1">
    <OPTION SELECTED>Unknown
     <OPTION>Traiined
    <OPTION>none
  
</SELECT>
  </td>
 </tr>
</table>
 <HR WIDTH="80%">

<INPUT TYPE="Reset" VALUE="Clear Form">
<INPUT TYPE="Submit" VALUE="Submit">
</FORM>

</body></html>

How do i write search.pl so when i select startdate : 2013-03-15 and enddate : 2013-03-24 AND select option animal AND select option Location AND select option Color AND select option training then SUBMIT it will search for me.

I cannot use sql because my system does not have it.
Thanks

Are you looking at automating that webpage using perl? Or do you want to write a perl CGI script that displays the html and handles the form data?

Do you think I should use html form and pl for script to get data from my flat file or i should use pl for form and also pull info too? I just need to know can perl handle search multiple fields on the same line or not. Thanks

Yes, you can do all of it using perl. You need to learn how to handle form data in a perl CGI script.

Do you know what was wrong with my code? It only show no results found loop and did not get the record i want?

#!/usr/bin/perl

use warnings;
use Time::Local;

print <<'HTML';
Content-type: text/html

<HTML><HEAD><TITLE>test</TITLE>
</HEAD>
<BODY TEXT="blue" LINK="blue" VLINK="#9900CC" ALINK="#330066">
<CENTER><h1><font color=black>Search Records</font></h1></CENTER>
<BR>

<center><FONT size=+1><TABLE BORDER=1><TR bgcolor=#669900><TD><center><font color=white>Animal</center></TD><TD><center><font color=white>Location</center></TD><TD><font color=white><center>Color</center></TD><TD><font color=white><center>Training</center></TD><TD><font color=white><center>Start Date</center></TD><TD><font color=white><center>End Date</center></TD></TR>

HTML
open (DATA,"./myfile.txt") || die ("Can't Open data File \n");
@data=<DATA>;
close DATA;

foreach $line (@data) {
	
	$x++;
	($ani,$loc,$colors,$training,$startdate,$enddate)=split(/\,/,$line);
	
my $startcollect = &date_to_unix_time($startdate);
my $endcollect = &date_to_unix_time($enddate);
my $startfrom = &date_to_unix($inputs{"startdate"});
my $endfrom = &date_to_unix($inputs{"enddate"});
$animal = $inputs{'animal'};
$location = $inputs{'location'};
$colour= $inputs{'color'}; 
$trainned = $inputs{'training'}; 
			if (($startcollect <= $startfrom) && ($endcollect <= $endfrom) && ($ani eq '$animal') && ($loc eq '$location') && ($colors eq '$colour') && ($training eq '$trainned'))
			{
		
			print "<TD BGCOLOR='d3d3d3'>$ani</TD><TD BGCOLOR='d3d3d3'>$loc</TD><TD BGCOLOR='d3d3d3'>$colors</TD><TD BGCOLOR='d3d3d3'>$training</TD><TD BGCOLOR='d3d3d3'>$startdate</TD><TD BGCOLOR='d3d3d3'>$enddate�</TD></TR> \n";
						 
			} else {
			    print "No results found.<p>\n";
}
}
print <<'HTML';
</TABLE></font></CENTER>
<BR><BR><BR><BR>
    </BODY></HTML>
HTML



sub date_to_unix()
{
    my ($year,$mon,$day,$hour,$min,$sec) =
        $_[0] =~ /(\d+)-(\d+)-(\d+)/;
    return undef unless ($day and $mon and $year);
    return timelocal(0,$min,$hour,$day,$mon-1,$year-1900);
}
sub date_to_unix_time()
{
    my ($year,$mon,$day,$hour,$min,$sec) =
        $_[0] =~ /(\d+)-(\d+)-(\d+)\s(\d+):(\d+):(\d+)/;
    return undef unless ($day and $mon and $year);
    return timelocal(0,$min,$hour,$day,$mon-1,$year-1900);
}

Thanks for your help

Hi,

Safer not to use DATA as it is a reserved word.

Furthermore you are reading only one line into @data ...

And this line will never eval to true because of apostrophs around $animal...

if (($startcollect <= $startfrom) && ($endcollect <= $endfrom) && ($ani eq '$animal')

And %inputs is never defined

And it is unsafe code as hell, please use %in for passed parameters ; start code with

use CGI