我需要对Perl CGI脚本有所了解。
首先,所有这些都在webmin下运行,所以我正在做一个自定义模块。
我正在调用从另一个Perl CGI传递2个参数的CGI Perl脚本。我呼叫的链接采用以下格式:
http://IP:8080/foobar/alat.cgi?sysinfo=xxxxxxx&SR=yyyyyyyy
#!/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
似乎是空的。
我做错了什么?
答案 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...
}
让我们看一下我在这里做的一些事情。
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();