这个 CGI/HTML/Perl 程序有啥问题? [关闭]
Posted
技术标签:
【中文标题】这个 CGI/HTML/Perl 程序有啥问题? [关闭]【英文标题】:What is the issue with this CGI/HTML/Perl program? [closed]这个 CGI/HTML/Perl 程序有什么问题? [关闭] 【发布时间】:2015-01-12 02:38:17 【问题描述】:我正在使用 XAMMP Apache 服务器。有一个名为“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;
【问题讨论】:
这很好……但是你的问题是什么? 你的 perl 可执行文件与什么有什么关系? 是的,抱歉。程序不会从包含用户搜索名称的文本文件中打印任何动物,我该如何解决这个问题? 看看你的代码在使用缩进时更容易阅读吗? 抱歉,我是新来的 - 如果有人能提供帮助,我将不胜感激 【参考方案1】:这里有几个问题,但问题的关键是这段代码。
@animals = (<IN>);
$item = param;
foreach $line (<IN>)
if ($line =~ /$item/)
print "$item";
让我们依次看每一行:
@animals = (<IN>);
这会将IN
中的所有数据读入数组@animals
。它还将IN
的文件指针留在文件末尾。从IN
读取数据的任何进一步尝试都将失败。
$item = param;
如果您在没有参数的情况下调用param
,您将获得在 CGI 请求中找到的参数名称列表。当您将此列表分配给标量值时,此行为会发生变化,您将获得 number 个参数。在您的系统中,这将始终为 1。所以$item
包含值 1。
foreach $line (<IN>)
还记得前几行你是如何从IN
中读取所有数据的吗?好吧,您正在尝试从此处读取更多数据。那是行不通的。我想你可能在这里想要@animals
,而不是<IN>
。目前,您的 foreach
永远不会执行,因为在第一次迭代时,对 <IN>
的调用会返回 undef
- 这是错误的。
if ($line =~ /$item/)
假设您已在 foreach
循环中将 <IN>
替换为 @animals
- 以便实际执行循环体。这仍然没有做你想要的。请记住,$item
包含 1 而不是要搜索的动物的名称。我怀疑你有一种叫做“1”的动物。
你可能想要的是更像这样的东西:
my $animal = param('Search');
while (<IN>)
print if /$animal/;
我还要指出,在 2014 年学习 CGI 非常荒谬。看看 Web::Simple 或 Dancer 之类的简单 Perl Web 框架会好得多。
【讨论】:
【参考方案2】:我认为你的问题是
$item = param;
这会将表单中的参数数量(在本例中为 2)放入 $item。我怀疑你有一个叫 2 的动物
改成
$item = param('Search');
【讨论】:
以上是关于这个 CGI/HTML/Perl 程序有啥问题? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章