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{}
和''
一样,但是更清楚是空串。
当你启用 strict 和 warnings 你可以很容易地知道 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 中打印页眉=]
我需要了解我的 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{}
和''
一样,但是更清楚是空串。
当你启用 strict 和 warnings 你可以很容易地知道 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 中打印页眉=]