Perl $#ARGV总是-1

这是AWS Windows 7 VM上的perl代码。 在下面的代码中, e.pl ab应该返回1而不是-1

这只发生在AWS VM上。 任何帮助将不胜感激。

 C:\test>type e.pl #!c:\strawberry\perl\bin\perl.exe print " \$#ARGV = $#ARGV\n"; C:\test>e.pl ab $#ARGV = -1 

——————-评论————-
感谢大家的帮助。 这是相当复杂的,因为它是我正在工作的http服务的一部分。 问题在于以下两行代码中。 第一行有口译员。 但它打破了http服务。 第二行在我的桌面上运行。 但在AWS(amazon web servicesEC2虚拟机)上不起作用。 我的故障拍摄发现第二行代码不会将$ args传递给driver.pl。 这是非常困难的拍摄麻烦。 感谢大家的帮助! 如果没有回答就可以了。

顺便说一句,我是一个经验丰富的perl编码器,并赞赏每个人的投入。

#my $ cmd =“start C:/strawberry/perl/bin/perl.exe c:/ $ _ TAF / driver.pl $ args”; < – 这打破了http服务
my $ cmd =“start 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"; 

我的猜测是你有与Perl关联的*.pl文件,但没有正确配置它将命令行参数传递给Perl解释器。

例如,通过我的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是你的脚本的名称)。

(我不是编辑注册表值的专家,也不接受如果您尝试的话会发生什么情况)。