我正在使用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;
答案 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');