5

问题: 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

4 回答 4

2

请注意, Perl 与C 中@ARGV的不太一样。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]将未初始化。

于 2013-04-04T21:03:15.950 回答
1

Windows 知道它应该使用 Perl 执行程序的方式有两种。

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

您已经简单地调用了您的脚本

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 就会得到他描述的行为。

于 2013-04-04T21:31:27.053 回答
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 Vista 到 Windows 8 改变了这种设置方式。但是,我有 Windows 7 并且没有这个问题。我确实确保安装 Perl,C:\Perl而不是C:\Program Files\Perl因为目录名称中的空格。我还安装了草莓 Perl。

有一个特殊的 Windows 环境变量称为PATHEXT. 这允许您输入foo而不是foo.pl. 如果 Windows 看不到如何执行您的文件,Windows 会检查%PATHEXT并尝试附加各种后缀,直到找到一个有效的后缀。您可能希望附加.PL到该环境变量,因此您可以输入foo而不是foo.pl一直输入。

于 2013-04-04T23:09:24.347 回答
0

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

于 2013-04-04T20:52:02.640 回答