【问题标题】:Running Perl script with filename as arg以文件名作为 arg 运行 Perl 脚本
【发布时间】:2011-05-18 11:11:33
【问题描述】:

在我的 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 上运行良好。 我应该怎么办? 谢谢。

【问题讨论】:

  • 你这样做会得到什么:G:>\perl> perl toxyz.pl ...
  • 哦...它有效...为什么它的工作方式不同?它已经在运行脚本,因为我的脚本输出了无效的 arg 消息。

标签: windows perl


【解决方案1】:

在您的具体示例中:

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

http://perldoc.perl.org/perlvar.html#%40ARGV

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

最后,编写 Perl 时不要使用 'use strict;使用警告;'是对挫折和最坏情况下的灾难的处方。

【讨论】:

  • 是的...我只是在味精中添加了单曲。
【解决方案2】:

你意识到你的 || 的右侧将返回 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) 将为真,因此您正在输入“错误”块

【讨论】:

  • 不,如果你将开关放在 arg 中,那么在 perl 中它会将它们收集为 var 并将适当的设置为 true。所以如果我提供 -i $i = true
  • 从未使用过该功能。新事物
  • 在哪个版本的 Perl 中?在 Windows 上使用 5.10.1 调用 'perl -e "print $i ? 1 : 0" -- -i' 将在控制台上显示 '0'。
  • 啊……这就是 -s 开关的作用。对于它的价值,我认为这是一个非常糟糕的“功能”,考虑到您的自动激活开关变量将践踏您的主命名空间的明显可能性。我会远离它。
  • 单独的-w-s 选项(相对于组合的-ws)不能可靠地移植;对于整个 shebang 行,不能保证超过 32 个字节,也不能保证超过一个命令和一个参数。如果使用#!/usr/bin/env perl,则无法可靠地提供该行上的其他命令行选项。
猜你喜欢
  • 2012-09-15
  • 1970-01-01
  • 2021-11-22
  • 2020-03-23
  • 2013-12-31
  • 2023-03-19
  • 1970-01-01
  • 2010-12-12
  • 2018-09-18
相关资源
最近更新 更多