这个 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,而不是&lt;IN&gt;。目前,您的 foreach 永远不会执行,因为在第一次迭代时,对 &lt;IN&gt; 的调用会返回 undef - 这是错误的。

if ($line =~ /$item/) 

假设您已在 foreach 循环中将 &lt;IN&gt; 替换为 @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 程序有啥问题? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

这个 C++ 程序有啥问题?

这个 C++ 程序有啥问题?

这个 x86 汇编冒泡排序程序有啥问题?

这个程序有啥错误?

我没明白这个示例程序集有啥问题

这个 UIAlertAction 代码有啥问题?不允许点击/点击并在应用程序中前进