将参数传递给脚本,得到:“使用未初始化的值$ ARGV [0]”

时间:2013-04-04 20:47:17

标签: perl argv

问题: Windows XP没有将命令行参数传递给perl脚本。

症状:一个简单的命令,如:

say "Argument 1 (\$ARGV[0]) is: $ARGV[0], argument 2 (\$ARGV[1]) is: $ARGV[1].";

导致:

Use of uninitialized value $ARGV[0] in concatenation (.) or string at... 

解决方案:

根本问题出在Windows XP中。启动perl的默认方法只传递第一个变量,即脚本名称。结果是$ ARGV [0]未初始化。

修复方法是在以下位置编辑Windows注册表:

\HKEY_CLASSES_ROOT\Perl\shell\Open\command

并输入条目:

"C:\Perl\bin\perl.exe"  %*

结果是:

C:\whatever>perl argtest.pl 1 2
Argument 1 ($ARGV[0]) is: 1, argument 2 ($ARGV[1]) is: 2.

特别感谢David W指出了我正确的方向。

4 个答案:

答案 0 :(得分:2)

请注意,Perl中的@ARGV与C中的argv不完全相同。

                              C          Perl

Name of the program        argv[0]        $0
1st argument               argv[1]      $ARGV[0]
2nd argument               argv[2]      $ARGV[1]
n-th argument              argv[n]      $ARGV[n-1]

因此,如果您向Perl脚本提供一个命令行参数,则可以在$ARGV[0]中找到它。 $ARGV[1]将被取消初始化。

答案 1 :(得分:1)

Windows知道有两种方法可以使用Perl来执行程序。

  1. 命令行以perl可执行文件开头,要运行的脚本名称作为命令行参数提供。这也是它在Unix和其他环境中的工作方式。
  2. 您的系统将一个或多个扩展程序(例如.pl.pm和/或.cgi)与Perl应用程序相关联,Windows将在您输入文件名时启动Perl这些扩展名或单击Windows资源管理器中包含其中一个扩展名的文件。
  3. 您已将脚本简单地调用为

    argtest 1 2
    

    而不是

    之一
    perl argtest 1 2
    argtest.pl 1 2
    

    这让我觉得Perl不是第一个查看argtest引用的文件的应用程序。也许有一个名为argtest.batargtest.exe的文件,其任务是让Perl运行您的Perl代码。由于某种原因,此中间程序未将您提供的命令行参数传递给Perl应用程序。

    提供此中间文件的代码,我们可以提供更多帮助。


    更新:David W提出了第三种方法 - 将PATHEXT环境变量设置为包含.pl文件并从命令行调用argtest - - 看他的回答。 然后,如果Window的文件与.pl扩展名的关联搞砸了,比如设置为C:\Dwimperl\perl\bin\perl“而不是”C:\Dwimperl\perl\binperl %*“那么OP将获得他描述的行为。

答案 2 :(得分:1)

下载Cygwin并在Cygwin环境中测试您的代码。我敢打赌这是一个Windows问题。 (如果你是一个Unix头,你会喜欢Cygwin,因为它为你的Windows机器提供类似Unix / Linux的环境。没有它就不使用Windows。)

Windows使用后缀来确定哪个程序打开了哪些文件。您的Perl脚本是argtestargtest.bat还是argtest.pl

在Windows上,确保所有Perl脚本都使用*.pl后缀,因此Windows将使用任何Perl参数来执行它们。 Windows不使用shebang

另一个可能的问题:在Windows XP上,我遇到了带参数的Perl脚本问题,因为Windows将此作为执行字符串:

 perl %1

将使用我的脚本执行Perl程序,但忽略参数。我不得不改为:

 perl %*

不幸的是,通过Windows 8的Windows Vista改变了它的设置方式。但是,我有Windows 7,没有这个问题。我确实在C:\Perl而不是C:\Program Files\Perl下安装了Perl,因为目录名中有空格。我也安装了Strawberry Perl。

有一个名为PATHEXT的特殊Windows环境变量。这样,您就可以输入foo而不是foo.pl。如果Windows无法看到如何执行您的文件,Windows将通过%PATHEXT并尝试附加各种后缀,直到找到有效的后缀。您可能希望将.PL附加到该环境变量,这样您就可以一直输入foo而不是foo.pl

答案 3 :(得分:0)

perl中,文件名不是参数数组的一部分。至少在测试中我必须删除ARGV[2]或传递三个参数,例如argtest 1 2 3