以下是AWS Windows 7 VM上的perl代码。在以下代码中,e.pl a b
应返回1
而不是-1
。
这仅发生在AWS VM上。任何帮助将不胜感激。
C:\test>type e.pl
#!c:\strawberry\perl\bin\perl.exe
print " \$#ARGV = $#ARGV\n";
C:\test>e.pl a b
$#ARGV = -1
-------------------评论-------------
谢谢大家的帮助。它非常复杂,因为它是我正在处理的http服务的一部分。问题在以下两行代码中。第一行有口译员。但它打破了http服务。第二行适用于我的桌面。但它不适用于AWS(Amazon Web Service EC2 VM)。我的麻烦发现第二行代码不会将$ args传递给driver.pl。这很麻烦。谢谢大家的帮助!如果没有回答,这没关系。
#my $ cmd =“start C:/strawberry/perl/bin/perl.exe c:/ $ _ TAF / driver.pl $ args”; < - 这打破了http服务
我的$ cmd =“开始c:/ $ _ TAF / driver.pl $ args”; < - 此行不会将$ args传递给driver.pl
--------这是源代码---------
#!/usr/bin/perl
{
package MyWebServer;
use HTTP::Server::Simple::CGI;
use base qw(HTTP::Server::Simple::CGI);
my %dispatch = (
'/hello' => \&resp_hello,
);
sub handle_request {
my $self = shift;
my $cgi = shift;
my $path = $cgi->path_info();
my $handler = $dispatch{$path};
if (ref($handler) eq "CODE") {
print "HTTP/1.0 200 OK\r\n"; $handler->($cgi);
} elsif (-e "${root}${path}") {
print "HTTP/1.0 200 OK\r\n";
{ #### process taf.cgi
######################## sub taf_cgi {
my $args = "help";
$args = $cgi->param("args");
my $tafRedirectory = $cgi->param("tafRedirectory");
my $refreshRate = 5;
print $cgi->header, $cgi->start_html("$root$path");
print "<pre>";
{ #my $cmd = "start C:/strawberry/perl/bin/perl.exe c:/$_TAF/driver.pl $args"; # <<<<<<<<<<<<<<<
my $cmd = "start c:/$_TAF/driver.pl $args"; # <<<<<<<<<<<<<<<
if ($^O =~ /win32/i) { ; } elsif ( $^O =~ /linux/i) { $cmd = "/usr/bin/perl /tmp/var/www/cgi-bin/$_TAF/driver.pl $args"; }
system $cmd;
}
print<<EOF1;
</pre>
<meta http-equiv="refresh" content="$refreshRate; url=$tafRedirectory">
EOF1
print $cgi->end_html ;
####################### }
}
}
}
sub resp_hello {
my $cgi = shift; # CGI.pm object
return if !ref $cgi;
...... ignored
}
}
# start the server on port 8080
my $httpport = 8080;
if ($^O =~ /win32/i) {;} elsif ($^O =~ /linux/i) { $httpport = "1234"; }
my $pid = MyWebServer->new($httpport)->background();
print "Use 'kill $pid' to stop server.\n";
答案 0 :(得分:1)
我的猜测是你有与Perl关联的*.pl
文件,但没有正确配置它以将命令行参数传递给perl解释器。
例如,搜索&#34;草莓&#34;通过我的Windows注册表最终将文件关联(在\HKEY_CLASSES_ROOT\Perl_program_file\shell\Execute Perl Program\command
下并在\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Perl_program_file\shell\Execute Perl Program\command
下)再次显示为
"C:\strawberry516\perl\bin\perl.exe" "%1" %*
最后的%*
很重要,我怀疑你错过了它 - 它代表所有其他命令行参数(%1
是你脚本的名字)。
(我不是编辑注册表值的专家,如果你尝试,会对会发生的事情不承担任何责任。)