我有一个需要执行另一个Perl脚本的Perl脚本.第二个脚本可以直接在命令行上执行,但我需要在第一个程序中执行它.我需要传递一些参数,这些参数通常在它独立运行时传递(第一个脚本定期运行,并在一组系统条件下执行第二个脚本).
Google的初步搜索建议使用反引号或system()调用.有没有其他方法来运行它?(我猜是的,因为它是我们正在讨论的Perl:P)如果我需要从被调用的程序中捕获输出,那么首选哪种方法(如果可能的话,将输出管道输出到stdout,就像第二次一样程序被直接调用)?
(编辑:哦,现在 SO提出了一些相关问题.这个问题很接近,但与我提出的问题并不完全相同.第二个程序可能需要一个小时或更长时间才能运行(大量I/O),所以我不确定一次性调用是否适合这种情况.)
当我尝试访问我的Perl脚本时,Windows上的Apache给出了以下错误:
Server error!
The server encountered an internal error and was unable to complete your request.
Error message:
End of script output before headers: sample.pl
If you think this is a server error, please contact the webmaster.
Error 500
localhost
Apache/2.4.4 (Win32) OpenSSL/1.0.1e PHP/5.5.3
Run Code Online (Sandbox Code Playgroud)
这是我的示例脚本
#!"C:\xampp\perl\bin\perl.exe"
print "Hello World";
Run Code Online (Sandbox Code Playgroud)
但不是在浏览器上工作
推送$DB::single=1和$DB::single=2代码之间有什么区别?当我在perl调试器命令行上执行'c'时,两者似乎都具有在赋值后停止执行的相同效果.
perldebug 说值为1相当于只按下's'进入下一个语句,2和'n'相同,但是它与你如何得到这个陈述有什么区别?
我有一个 Perl CGI 脚本,它显然随机地发出不同的 HTML。没有任何输入改变。例如,我将运行wget两次并得到两个不同的结果。CGI 由同样不会改变的开发数据库提供支持。
我有一个调试语句,它通知我从数据库返回到脚本中的元素数量相同。
坦白说,我很困惑。逻辑、DB 和输入不会改变,但输出会。
http 服务器是 Ubuntu 10.04 上的 apache2。Perl 版本是 perl 5.10。
编辑:每当我从服务器上的命令行运行它时,输出都是正确的。
编辑 2:一些糟糕的运行看起来像是脚本的先前版本。我不认为Apache 是缓存 CGI,但它似乎可能正在抓取过时的缓存版本......
当我尝试在支持 perl 的 Web 服务器中运行以下代码时,出现 500 内部服务器错误:
#! /usr/bin/perl
use LWP;
my $ua = LWP::UserAgent->new;
$ua->agent("TestApp/0.1 ");
$ua->env_proxy();
my $req = HTTP::Request->new(POST => 'http://www.google.com/loc/json');
$req->content_type('application/jsonrequest');
$req->content('{ "cell_towers": [{"location_area_code": "55000", "mobile_network_code": "95", "cell_id": "20491", "mobile_country_code": "404"}], "version": "1.1.0", "request_address": "true"}');
my $res = $ua->request($req);
if ($res->is_success) {
print $res->content,"\n";
} else {
print $res->status_line, "\n";
return undef;
}
Run Code Online (Sandbox Code Playgroud)
但是当我运行下面的代码时没有错误:
#! /usr/bin/perl
use CGI::Carp qw(fatalsToBrowser);
print "Content-type: text/html\n\n";
print "<HTML>\n";
print "<HEAD><TITLE>Hello World!</TITLE></HEAD>\n";
print "<BODY>\n";
print "<H2>Hello World!</H2> <br /> \n";
foreach …Run Code Online (Sandbox Code Playgroud) 我有这篇文章我在Perl CGI程序中写道:
$text = $message;
@lines = split(/\n/, $text);
$lCnt .= $#lines+1;
$lineStart = 80;
$lineHeight = 24;
Run Code Online (Sandbox Code Playgroud)
我想在45个字符后强制返回.我怎么在这里这样做?
在此先感谢您的帮助.
我正在尝试在Windows 7上运行示例Perl脚本,并且我配置了IIS 7以允许ActivePerl运行但我收到此错误:
HTTP Error 502.2 - Bad Gateway The specified CGI application misbehaved by not returning a complete set of HTTP headers. The headers it did return are "Hello World. ". Module CgiModule Notification ExecuteRequestHandler Handler Perl Script (PL) Error Code 0x00000000 Requested URL http://localhost:80/hello.pl Physical Path C:\inetpub\wwwroot\hello.pl Logon Method Anonymous Logon User Anonymous
这是我的Perl脚本:
#!/usr/bin/perl
print "Hello World.\n";
Run Code Online (Sandbox Code Playgroud) 我尝试在我的服务器上执行一个简单的perl脚本,我得到一个内部500服务器,当我检查错误日志时,它显示:
Premature end of script headers: test.pl
这是perl脚本:
#!/usr/bin/perl -w
print "Content-type: text/plain\n\n";
print "testing...\n";
Run Code Online (Sandbox Code Playgroud)
我的cgi-bin文件夹具有0755的权限.脚本本身也是0755.该脚本由apache拥有,并且在apache组中.该脚本通过命令行正常工作.
有什么问题,我该如何解决这个问题?!
谢谢大家的帮忙!
有趣的发现在suExec:
2010-09-14 17:38:28]: uid: (10001/som) gid: (2522/2522) cmd: test.pl
[2010-09-14 17:38:28]: target uid/gid (10001/2522 or 2521) mismatch with directory (48/0) or program (48/0)
Run Code Online (Sandbox Code Playgroud)
但我的cgi文件夹与test.pl脚本相同 - 它是指另一个目录吗?
我开始在我的 Mac 上编写一个简单的 Perl 程序,我知道第一行需要是 Perl 本身的位置,我找到的每个示例或教程都告诉我第一行应该是:
“#!/usr/bin/perl”
但是,在那里,我尝试在本地主机下运行该文件,但收到此错误:
内部服务器错误 服务器遇到内部错误或配置错误,无法完成您的请求。请联系服务器管理员 you@example.com 并告知他们错误发生的时间以及您可能执行的任何操作可能导致错误。有关此错误的更多信息可在服务器错误日志中找到。
任何人都知道为什么会发生这种情况?
预先感谢,如果需要更多信息,请告诉我!
PS如果有帮助,当我执行命令时:“perl -v”它告诉我
这是为 darwin-thread-multi-2level 构建的 perl v5.10.0(带有 2 个注册补丁,请参阅 perl -V 了解更多详细信息)
我非常喜欢使用Firebug来调试我的JavaScript代码,HTML DOM和网络加载,即:客户端关于Web开发的所有内容.
服务器端的情况并不那么明亮.我正在使用的应用程序使用Perl和强制性标准模块,如CGI和DBI.我知道标准的故障排除技术,但似乎没有跟踪例如数据库查询或函数调用的调试工具,并给我很好的输出.
输出必须特别不仅仅是在STDOUT(想象Content-Type: application/json)或STDERR(通过错误日志进行捣乱非常不舒服)被拉动,并且该工具不应该要求我手动将填充物填充到核心模块中或者use Data::Dumper; print '<pre>',Dumper($foo),'</pre>'在整个代码中喷洒.
长话短说:是否有一个工具可以让Perl/CGI的服务器端调试像Firebug在客户端那样有趣?