perl CGI脚本的输入参数

Input parameter for perl CGI script

我需要了解我的 Perl CGI 脚本。

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

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

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 似乎是空的。

我做错了什么?

如@Сухой27 所说,将 use strict; 添加到脚本的顶部,在 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->new。这确实是一回事,但它与 OOP Perl 世界的其余部分一致,而且更清楚的是您正在调用 CGI 包上的 new 方法。
  • 如果您有 $q,请继续使用它。没有$in.
  • 使用 my 声明所有变量。
  • 声明 %text 以便您以后可以使用 $text{'edit_title'}。可能是您导入了它,或者从您向我们展示的代码中省略了它。
  • 声明ui_print_header()。见上文。
  • q{}''一样,但是更清楚是空串。

当你启用 strictwarnings 你可以很容易地知道 errors.Also 你应该检查 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>";

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

#!/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 定义的,它基本上在 [=16 中打印页眉=]