这个CGI / HTML / Perl程序有什么问题?

时间:2014-11-14 16:25:27

标签: html perl xampp cgi

我正在使用XAMMP Apache Server。有一个名为'animal.txt'的文本文件,其中包含每行上动物的名称,并附有基本描述。

我正在尝试使用HTML和CGI编写Perl程序。该程序的目的是让用户使用HTML表单搜索动物名称。然后,它将链接到Perl程序,该程序循环遍历animal.txt文件并逐行读取文件。该程序将从原始HTML表单中获取与用户搜索匹配的任何行,并打印包含相同名称的所有动物。

到目前为止,这就是我所在的地方:

(客户形式)

#!\xampp\perl\bin\perl.exe
use CGI qw/:standard/; # load standard CGI routines
use CGI::Carp('fatalsToBrowser'); 

print header(); # create the HTTP header
print  <<HTML
<head>
  <title>Shop Here</title>
 </head>
 <body>

<h1>Animal list search</h1>

     A basic form  <br />

  <form action="dumpsVar2.pl"> 
    Search:     <input type="text", name="Search" size=5><br><br>
    Submit:     <input type="submit" name="select" size="7"><br>
    </form> 
  </body>
 </html>
 HTML

然后是perl程序:(服务器端)        #!\ XAMPP \ Perl的\ BIN \ perl.exe所在

use CGI qw(:standard);
use CGI::Carp('fatalsToBrowser'); 
$query = new CGI;

@parameters = $query -> param;
print header, start_html("Parameters");
print "$0 was passed these parameters:<br>  <br> ";

foreach $name (@parameters) {
    $value = $query -> param($name);
    print p("$name = $value"); 
} 
$inFile = "animal.txt";
open (IN, $inFile) or die "Can't find file: $inFile";

@animals = (<IN>);
$item = param;
foreach $line (<IN>) {
    if ($line =~ /$item/) {
        print "$item";
    }
}

print end_html;

2 个答案:

答案 0 :(得分:1)

这里有几个问题,但问题的关键是这段代码。

@animals = (<IN>);
$item = param;
foreach $line (<IN>) {
    if ($line =~ /$item/) {
        print "$item";
    }
}

让我们依次查看每一行:

@animals = (<IN>);

这会将IN中的所有数据读入数组@animals。它还将IN的文件指针留在文件的末尾。从IN读取数据的任何进一步尝试都将失败。

$item = param;

如果您在没有参数的情况下调用param,则会获得在CGI请求中找到的参数名称列表。当您将此列表分配给标量值时,此行为会发生变化,您将获得参数的数字。在您的系统中,这将始终为1.因此$item包含值1.

foreach $line (<IN>) {

还记得你如何阅读IN几行中的所有数据?那么你在这里尝试从中读取更多数据。这不起作用。我想你可能想要@animals,而不是<IN>。目前,foreach永远不会执行,因为第一次迭代调用<IN>会返回undef - 这是假的。

if ($line =~ /$item/) {

我们假设您已在<IN>循环中将@animals替换为foreach,以便循环体实际执行。这仍然没有做你想要的。请记住,$item包含1而不是要搜索的动物的名称。我怀疑你有一种名为&#34; 1&#34;。

的动物

你可能想要的更像是这样:

my $animal = param('Search');
while (<IN>) {
    print if /$animal/;
}

我还指出,2014年学习CGI非常荒谬。如果想看一个像Web :: Simple或Dancer这样简单的Perl Web框架,你会好得多。

答案 1 :(得分:0)

我认为你的问题是

$item = param;

将表单中的参数数量(在本例中为2)放入$ item。我怀疑你有一只名为2的动物

将其更改为

$item = param('Search');