Perl $#ARGV总是-1

时间:2014-05-27 00:01:13

标签: windows perl amazon-web-services argv

以下是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。这很麻烦。谢谢大家的帮助!如果没有回答,这没关系。

顺便说一下,我是一位经验丰富的perl编码员,非常感谢大家的投入。

#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";

1 个答案:

答案 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是你脚本的名字)。

(我不是编辑注册表值的专家,如果你尝试,会对会发生的事情不承担任何责任。)