perl CGI脚本的输入参数

时间:2015-06-05 07:23:12

标签: perl cgi

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

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

我正在调用从另一个Perl CGI传递2个参数的CGI Perl脚本。我呼叫的链接采用以下格式:

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

我做错了什么?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

谢谢大家的快速回答,因为我怀疑我只是犯了一些愚蠢的错误。 在此添加现在正常工作的更正代码

#!/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打印页面标题

答案 2 :(得分:-1)

当您启用严格警告时,您可以轻松了解错误。另外您应该检查Apache错误日志,我认为脚本应该是这样的:

cv::Mat input = cv::imread("input.jpg", CV_LOAD_IMAGE_GRAYSCALE);
cv::vector<cv::vector<cv::Point>> contours;
cv::vector<cv::Vec4i> hierarchy;

// Find contours
cv::findContours(input, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);

// Find the convex hull
cv::vector<cv::vector<cv::Point>> hull(contours.size());
for(int i = 0; i < contours.size(); i++)
{
    cv::convexHull(cv::Mat(contours[i]), hull[i], false);
}

cv::Mat drawing = cv::Mat::zeros(input.size(), CV_8UC3);
cv::Scalar color = cv::Scalar(0, 0, 255);
for (int j  = 0; j < hull.size(); j++)
{
    cv::drawContours(drawing, hull, j, color, 1, 8, cv::vector<cv::Vec4i>(), 0, cv::Point());
}

cv::imshow("Convex hull", drawing);
cv::waitKey();