【问题标题】:Unable to get this simple Perl CGI program running无法运行这个简单的 Perl CGI 程序
【发布时间】:2012-09-21 21:27:29
【问题描述】:

谁能向我解释一下让 perl 在服务器上工作的基础知识。我需要服务器上的模块吗?如果是这样,它会去哪里?我如何命名我的文件以及它们去哪里?

据我了解,您需要一个模块,它位于 cgi-bin 中。无论我将文件命名为 .pl 还是 .cgi,我都无法得到明确的答案,当我将它放入 cgi-bin 时,我遇到了服务器错误。我的权限也设置为 777,所以这应该不是问题。

请帮忙!我只想了解如何使非常基本的程序正常工作,例如下面的程序。提前致谢!

    #!/usr/bin/perl
    require("cgi-lib.pl");
    print &PrintHeader;

    print "<html>";
    print "<head><title>Hello world!</title></head>";
    print "<body>";
    print "<p>Hello world!</p>";
    print "</body>";
    print "</html>";

【问题讨论】:

  • 你是不是把cgi-lib.pl放在同一个目录下,权限一样?你得到什么错误?服务器日志中写了什么?
  • 我收到 (8)Exec 格式错误:'home/site/cgi-bin/simple.pl' 的执行失败并且脚本头过早结束:simple.pl
  • 是的,我在 cgi-bin 文件夹中有 cgi-lib.pl
  • cgi-lib.pl 来自 perl 4 天,差不多 20 年前。我能问一下你按照什么说明提到它吗?
  • 无论您遵循的任何建议使用 cgi-lib.pl 的说明都应该丢弃。十多年来,没有人(或者至少没有人)使用过这个库。

标签: perl cgi cgi-bin


【解决方案1】:

cgi-lib.pl 的最新版本是 1999 年发布的,已经非常过时了。我建议您改用 CGI 库,它几乎肯定已经安装在您的服务器上并保持最新(最近一次是在 2012 年 8 月 16 日)

您的程序应如下所示:

#!/usr/bin/perl -- 

use strict;
use warnings;

use CGI ':standard';

print header;

print <<END;
<html>
  <head><title>Hello world!</title></head>
  <body>
    <p>Hello world!</p>
  </body>
</html>
END

还请注意,您可以从命令行运行程序以查看它是否编译以及它生成的输出。一旦你在那里工作,你可以将它移动到服务器

【讨论】:

    【解决方案2】:

    您面临的问题是您可能在 Windows 机器上编辑了源文件,它在每个换行符之前插入一个 CR 字符。确保您的代码不包含任何 CR 或将第一行更改为:

    #!/usr/bin/perl -- 
    

    (即行尾的两个破折号和一个空格)

    【讨论】:

    • 谢谢!我不在 Windows 机器上,但它是空格和 2 个破折号
    【解决方案3】:

    我同意 Dave Cross 的评论,您需要告诉您的学校,他们对您的教学有误。我们在 Perl 领域正试图让人们停止使用 CGI 模块,而您正在使用它的前身!

    这是一个现代 Perl 框架中的 hello world 应用程序,Mojolicious

    #!/usr/bin/env perl
    
    use Mojolicious::Lite;
    
    get '/' => 'hello';
    
    app->start;
    
    __DATA__
    
    @@ hello.html.ep
    <html>
      <head><title>Hello world!</title></head>
      <body>
        <p>Hello world!</p>
      </body>
    </html>
    

    您将其放入文件中(比如说test.pl)。通过运行安装 Mojolicious:

    curl get.mojolicio.us | sh
    

    然后通过运行启动您的应用程序

    perl test.pl daemon
    

    现在您可以在浏览器中访问http://localhost:3000 来查看结果,无需 Apache,无需 cgi-bin!

    一个更有趣的例子是一个带有默认值的“参数”:

    #!/usr/bin/env perl
    
    use Mojolicious::Lite;
    
    get '/:name' => { name => 'world' } => 'hello';
    
    app->start;
    
    __DATA__
    
    @@ hello.html.ep
    <html>
      <head><title>Hello <%= $name %>!</title></head>
      <body>
        <p>Hello <%= $name %>!</p>
      </body>
    </html>
    

    运行这个并尝试访问http://localhost:3000/SilverNightaFall 看看它做了什么!

    这种将动态值插入到 HTML 中的过程称为模板化,现在更受欢迎(而不是在每次请求时生成整个 HTML)。

    【讨论】:

      猜你喜欢
      • 2020-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-30
      • 2019-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多