【问题标题】:Input parameter for perl CGI scriptperl CGI 脚本的输入参数
【发布时间】:2015-08-20 01:24:36
【问题描述】:

我需要对我的 Perl CGI 脚本有所了解。

首先,这是在 webmin 下运行的,所以我正在做一个自定义模块。

我正在调用一个 CGI Perl 脚本,它从另一个 Perl CGI 传递 2 个参数。我调用的链接格式如下:

http://IP:8080/foobar/alat.cgi?sysinfo=xxxxxxx&SR=yyyyyyyy

alat.cgi 脚本如下所示

#!/usr/bin/perl
use CGI qw(:standard); 
ReadParse();
$q = new CGI;
my $dir = $in->param('SR');
my $s = $in->param('sysinfo');
ui_print_header(undef, $text{'edit_title'}.$dir, "");
print $dir."<br>";
print $s"<br>"; 

我打印出来的唯一输出是$dir 的值,$s 似乎是空的。

我做错了什么?

【问题讨论】:

  • use strict; use diagnostics; 可能会有所帮助。
  • 最后一行在 $s 和 "
    " 之间缺少一个操作符……这是拼写错误吗?
  • $q$in 不同。
  • 谢谢,我实际上遇到了一些愚蠢的语法错误,最终我能够使用诊断程序检测到这些错误。对于相同的讨论,在此处添加更正的脚本:#!/usr/bin/perl # 在选定的 sysinfo 上运行 alat 并允许显示输出 #use strict;使用诊断;需要'recoverpoint-lib.pl';使用 CGI qw(:standard);读取解析();我的 $q = 新 CGI;我的 $dir = $q->param('SR');我的 $s = $q->param('sysinfo'); ui_print_header(undef, $text{'edit_title'}.$dir, "");打印 $dir."
    ";打印 $s."
    ";
  • 不要在代码中保留use diagnostics。仅用于非常具体的分析。它非常慢并增加了执行时间。

标签: perl cgi


【解决方案1】:

正如@Сухой27 所说,将use strict;use warnings; 添加到脚本顶部,就在shebang (#!/usr/bin/perl) 行下方。这些会告诉你语法错误和 Perl 正在做一些你可能不打算做的事情的其他事情。

使用 CGI(顺便说一句,在最新的 5.22 版本中它不再是 Perl 核心的一部分)和您想要采用的面向对象方法,您不需要使用ReadParse()。这是 Perl 4 的 cgilib.pl 时代留下的可憎之处。

我不知道你的ui_print_header 函数是做什么的。我猜它会输出一堆 HTML。你确定你定义了吗?

修复所有语法错误并使用现代语法后,您的程序将如下所示。我会分解发生在你身上的事情。

#!/usr/bin/perl
use strict;
use warnings;
use CGI;

my $q = CGI->new;
my $dir = $q->param('SR');
my $s = $q->param('sysinfo');

# you need to declare this to use it below
my %text = ( edit_title => 'foo' );

# we declare this sub further down
ui_print_header(undef, $text{'edit_title'} . $dir, q{});

print $dir . '<br />';
print $s . '<br  />';

sub ui_print_header {
  my ( $foo, $title, $dir, $bar ) = @_;

  # do stuff here...
}

让我们看看我在这里做的一些事情。

  • 按照 CGI 文档的建议说 new CGI 很好,但由于我们使用的是 OOP 方式,您可以使用更常见的 CGI-&gt;new。这实际上是一回事,但它与 OOP Perl 世界的其他部分一致,而且更清楚的是,您正在调用 CGI 包上的 new 方法。
  • 如果您有$q,请继续使用它。没有$in
  • 使用my 声明所有变量。
  • 声明%text,以便以后可以使用$text{'edit_title'}。可能是您导入了它,或者从您向我们展示的代码中省略了它。
  • 声明ui_print_header()。见上文。
  • q{}'' 相同,但更清楚的是它是一个空字符串。

【讨论】:

  • 查看 SawyerX 的演讲 CGI.pm must die!,这非常有趣并说明了 CGI 过时的原因:youtube.com/watch?v=jKOqtRMT85s - 当然你仍然可以使用它,但是考虑到今天有很多更容易的事情。 :)
【解决方案2】:

感谢大家的快速回答,正如我所怀疑的那样,我只是犯了一些愚蠢的错误。 在此处添加现在可以使用的更正代码

#!/usr/bin/perl
# Run alat on selected sysinfo and allow display of output
#use strict; 
use diagnostics;
require 'recoverpoint-lib.pl';
use CGI qw(:standard); 
ReadParse();
my $q = new CGI;
my $dir = $q->param('SR');
my $s = $q->param('sysinfo');

ui_print_header(undef, $text{'edit_title'}.$dir, "");
print  $dir."<br>";
print  $s."<br>";

为了澄清之前的一些答案,这是 webmin 的自定义模块,因此变量 $text 被导入,函数 ui_print_header 是 webmin 定义的,它基本上以 HTML 格式打印页眉

【讨论】:

  • use strict; 应该取消注释。
【解决方案3】:

当你启用 strictwarnings 时,你可以很容易地知道错误。另外你应该检查 Apache 错误日志,我认为脚本应该是这样的:

#!/usr/bin/perl
use CGI qw(:standard); 
use strict;
use warnings;
ReadParse();
my $q = new CGI;
my $dir = $q->param('SR');
my $s = $q->param('sysinfo');
ui_print_header(undef, $text{'edit_title'}.$dir, "");
print $dir."<br>";
print $s."<br>";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 2012-01-15
    • 2012-03-10
    • 1970-01-01
    • 2012-01-19
    相关资源
    最近更新 更多