问题: 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指出了我正确的方向。
答案 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来执行程序。
.pl
,.pm
和/或.cgi
)与Perl应用程序相关联,Windows将在您输入文件名时启动Perl这些扩展名或单击Windows资源管理器中包含其中一个扩展名的文件。您已将脚本简单地调用为
argtest 1 2
而不是
之一perl argtest 1 2
argtest.pl 1 2
这让我觉得Perl不是第一个查看argtest
引用的文件的应用程序。也许有一个名为argtest.bat
或argtest.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脚本是argtest
,argtest.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