Windows 运行文件名为arg的Perl脚本

Windows 运行文件名为arg的Perl脚本,windows,perl,Windows,Perl,在我的OSX盒上工作时,我的perl脚本毫无怨言地接受我的参数,而在windows上则不接受 以下是我在cmd中所做的: G:\perl>toxyz.pl -i "G:\perl\filename.log" Error: invalid arguments. G:\perl> 我的perl代码: #!/usr/bin/perl -w -s use File::Basename; $logfile = $ARGV[0]; if(!$logfile || (!$s &&am

在我的OSX盒上工作时,我的perl脚本毫无怨言地接受我的参数,而在windows上则不接受

以下是我在cmd中所做的:

G:\perl>toxyz.pl -i "G:\perl\filename.log"
Error: invalid arguments.
G:\perl>
我的perl代码:

#!/usr/bin/perl -w -s
use File::Basename;

$logfile = $ARGV[0];

if(!$logfile || (!$s && !$i)){
    print STDERR "Error: invalid arguments.";
    exit(1);
}
这在OSX上运行良好。 我该怎么办?
谢谢。

您意识到,| |的右侧将返回true,因为$s和$i没有定义,将被视为false

我把这个放在我的mac上

Name "main::s" used only once: possible typo at ./tmp.pl line 6.
Name "main::i" used only once: possible typo at ./tmp.pl line 6.

因此(!$s&&!$i)将为真,因此您正在输入“错误”块

您意识到,| |的右侧将返回真,因为$s和$i未定义,将被视为假

我把这个放在我的mac上

Name "main::s" used only once: possible typo at ./tmp.pl line 6.
Name "main::i" used only once: possible typo at ./tmp.pl line 6.

因此(!$s&&!$i)将为真,因此您在特定示例中输入了“错误”块

$ARGV[0] = '-i'
$ARGV[1] = 'G:\perl\E-Garugamblin-1-1-irc.log'

此外,Windows要求命令行参数用双引号括起来,而不是单引号


最后,编写Perl时不必“严格使用”;使用警告是治疗沮丧和最坏情况下的灾难的良方。

在您的具体示例中:

$ARGV[0] = '-i'
$ARGV[1] = 'G:\perl\E-Garugamblin-1-1-irc.log'

此外,Windows要求命令行参数用双引号括起来,而不是单引号


最后,编写Perl时不必“严格使用”;使用警告是治疗沮丧和最坏情况下的灾难的良方。

当你这样做时,你会得到什么:G:>\perl>perl-toxyz.pl…哦…它起作用了…为什么会有不同的效果?它已经在运行脚本,因为我的脚本输出了无效的arg消息。当您执行以下操作时会得到什么:G:>\perl>perl toxyz.pl…哦…它可以工作…为什么工作方式不同?它已经在运行脚本,因为我的脚本输出了无效的arg消息。不,如果在arg中放置开关,那么在perl中,它会将它们收集为var,并将相应的值设置为true。因此,如果我提供-i,那么$i=true从未使用过该功能。什么是新版本的Perl?在Windows上使用5.10.1调用“perl-e”print$i?1:0“--i”将在控制台上显示“0”。啊。。。这就是-s开关的作用。值得一提的是,考虑到auto-vivified switch变量可能会践踏主名称空间,我认为这是一个非常糟糕的“特性”。我会远离它。单独的
-w
-s
选项(与组合的
-ws
相反)不能可靠地移植;整个shebang行不能保证超过32个字节,也不能保证超过一个命令和一个参数。如果您使用
#/usr/bin/env perl
,您无法在该行上可靠地提供其他命令行选项。不,如果您在arg中放置开关,那么在perl中,它会将它们收集为var,并将相应的值设置为true。因此,如果我提供-i,那么$i=true从未使用过该功能。什么是新版本的Perl?在Windows上使用5.10.1调用“perl-e”print$i?1:0“--i”将在控制台上显示“0”。啊。。。这就是-s开关的作用。值得一提的是,考虑到auto-vivified switch变量可能会践踏主名称空间,我认为这是一个非常糟糕的“特性”。我会远离它。单独的
-w
-s
选项(与组合的
-ws
相反)不能可靠地移植;整个shebang行不能保证超过32个字节,也不能保证超过一个命令和一个参数。如果您使用
#/usr/bin/env perl
,您无法在该行上可靠地提供其他命令行选项。是的…我只是在msg中添加了single-on-contract。是的…我只是在msg中添加了single-on-contract。