Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何决定是否使用Perl CGI与常规HTML输出_Perl_Cgi - Fatal编程技术网

如何决定是否使用Perl CGI与常规HTML输出

如何决定是否使用Perl CGI与常规HTML输出,perl,cgi,Perl,Cgi,我发现,在创建HTML页面时不再推荐CGI,但我对在何处使用CGI的搜索结果比答案更令人困惑 如果我的问题是基本的,我很抱歉,但我希望我的问题的答案将有助于澄清一些事情 我被告知不要创建这样的表单: sub output_form { my ($q) = @_; print $q->start_form( -name => 'main', -method => 'POST', ); print $q->

我发现,在创建HTML页面时不再推荐CGI,但我对在何处使用CGI的搜索结果比答案更令人困惑

如果我的问题是基本的,我很抱歉,但我希望我的问题的答案将有助于澄清一些事情

我被告知不要创建这样的表单:

sub output_form {
    my ($q) = @_;


    print $q->start_form(
        -name => 'main',
        -method => 'POST',
    );

    print $q->start_table;

    print $q->Tr(
      $q->td('Update#:'),
      $q->td(
        $q->textfield(-name => "update_num", -size => 02)
      )
    );

    print $q->Tr(
      $q->td('Date:'),
      $q->td(
        $q->textfield(-name => "date",-id => "datepicker")
      )
    );

    print $q->Tr(
      $q->td('Location:'),
      $q->td(
        $q->textfield(-name => "location", -size => 50)
      )
    );

    print $q->Tr(
      $q->td('Queue:'),
      $q->td(
        $q->textfield(-name => "queue", -size => 50)
      )
    );

    print $q->Tr(
      $q->td('ETO:'),
      $q->td(
        $q->textfield(-name => "eto", -size => 50)
      )
    );

    print $q->Tr(
      $q->td('CAD#:'),
      $q->td(
        $q->textfield(-name => "cad", -size => 50)
      )
    );

    print $q->Tr(
      $q->td('Remarks:'),
      $q->td(
        $q->textfield(-name => "remarks", -size => 50)
    )
<html>
  <head><title>What's your name?</title></head>
  <body>
    <form enctype="multipart/form-data">
    Enter name: <input name="name" />
    </form>
  </body>
</html>
<html>
  <head><title>Welcome [% name %]</title></head>
  <body>
    <h1>Hello [% name %]</h1>
    <p>Pleased to meet you.</p>
  </body>
</html>
但是,如果我使用常规HTML页面创建这样一个表单,我是否能够与来自Perl脚本的用户输入交互?

Update 我又看了一遍你的问题,似乎你已经在
CGI
提供的东西中根深蒂固,以至于你迷失了方向

但是,如果使用常规HTML页面创建这样一个表单,我是否能够与来自Perl脚本的用户输入交互

无论你的程序做什么,不管它做什么,它都必须将一个普通的HTML页面发送回发出原始请求的浏览器。各种各样的
start\u表单
start\u表
Tr
td
等函数都没有什么神奇之处,
CGI
提供了这些函数:它应该是一种使用Perl语法生成HTML的更方便的方法

生成HTML与CGI协议无关,许多人认为在名为
CGI
的模块中包含这种功能是不合适的。这就导致了一些事情,例如,它提供了类似于
CGI

其他功能的发展为CGI协议提供了支持,例如

有更多的例子分别实现了原始
CGI.pm
的两个方面,但是您关心的是您是否可以通过HTTP与用户交互

同样地,
CGI.pm
提供的函数没有什么特别之处。您应该从命令行运行一个旧的CGI程序,以查看它只生成您在调用中指定的HTML字符串,并且您可以以任何方便的方式创建该字符串

一旦HTML被构建并发送到客户端,消息的构建方式就没有什么区别了。该页面将显示在浏览器上,它将为用户提供请求更多信息的机会

我希望这对你更清楚



查看CGI以外的选项

但您所说的是构建HTML,这与CGI无关,对该模块的一个主要批评是,它将太多的功能包装在一个框中

您应该关注使用模板包来构建HTML,其中最流行的是


您可能有额外的CSS样式和JavaScript智能,它们应该作为单独的文件从HTML链接起来。HTML构建方法总是一只丑小鸭,某种形式的模板是首选。另一方面,处理与客户机交互(CGI)的方法首先被mod_perl(它有自己的库来处理这类事情)取代,然后被Dancer和Mojolicious等框架取代


这些框架还包含模板。没有什么理由再学习旧式CGI了,除非您正在维护旧代码。舞者和魔咒营之间也有很多争论;我建议选择一个,在一个项目中学习,然后在另一个项目中学习另一个。

对于要向用户显示HTML页面的浏览器,web服务器必须返回HTTP响应,其中包含正文中所需的HTML。有时HTML是从静态文件返回的,有时它是由某个服务器端应用程序生成的

浏览器并不关心(事实上,也不太可能知道)HTML是如何生成的。它只知道它收到了一个HTTP响应,该响应的内容类型为text/html,主体由需要解析和呈现的html组成

所以你有两个选择。您可以编写包含表单的静态HTML文件。或者您可以编写一个Perl程序来生成它。这两个选项对浏览器都没有影响。您已经选择编写一个Perl程序。您可以使用各种技术来实现这一点。现在我不推荐CGI(请参阅以获得一些建议),但让我们假设我们会这样做

(这里还值得指出的是,CGI协议与CGI.pm库不同,CGI.pm库通常用于编写在该协议下运行的Perl程序。您不需要使用CGI.pm来编写CGI程序。)

用于包含用于生成HTML的帮助函数的CGI.pm。它们现在已弃用,并已移动到单独的模块中。他们反对的原因有很多。最明显的一点可能是,在许多项目中,设计和实现站点前端的人员与编写后端代码的人员是不同的。如果前端开发人员已经需要了解HTML、CSS和Javascript,那么期望他们了解Perl是有点不公平的,因为他们需要Perl来使用HTML生成功能编辑网页。即使在我是唯一一个在网站上工作的人的情况下,我发现在前端和后端技术之间强制严格分离有助于保持代码更干净

所以我真的不建议使用这些函数。据我所知,没有人愿意。相反我会使用模板系统。特别是,我会使用(这是个人偏好,但是)

使用模板引擎,您可以将所有HTML代码放在一个完全独立的文件中,前端团队可以以任何方式拥有和编辑该文件。然后,当后端代码需要显示HTML页面时,可以使用模板处理功能
<html>
  <head><title>Welcome [% name %]</title></head>
  <body>
    <h1>Hello [% name %]</h1>
    <p>Pleased to meet you.</p>
  </body>
</html>