【问题标题】:Why doesn't my Perl one-liner work on Windows?为什么我的 Perl 单行代码不能在 Windows 上运行?
【发布时间】:2010-10-14 05:19:50
【问题描述】:

从 Windows 命令提示符生成一个目录中所有文件的文本文件:

dir c:\logfiles /B > config.txt

输出:

0001_832ec657.log
0002_a7c8eafc.log

我需要将“config.txt”文件提供给另一个可执行文件,但在此之前,我需要修改该文件以添加一些可执行文件所需的附加信息。所以我使用以下命令:

perl -p -i.bak -e 's/log/log,XYZ/g' config.txt

我希望结果是:

0001_832ec657.log,XYZ
0002_a7c8eafc.log,XYZ

但是,“config.txt”文件没有被修改。使用“-w”选项,我收到警告消息:

在 -e 第 1 行的 void 上下文中无用地使用常量。

我做错了什么?

【问题讨论】:

  • 这可能是关于如何在 Windows 上运行 Perl 单行代码的典型问题。

标签: windows perl


【解决方案1】:

Windows cmd.exe 不使用 ' 作为字符串分隔符,仅使用 "。你所做的相当于:

perl -p -i.bak -e "'s/log/log,XYZ/g'" config.txt

所以-w 抱怨“你给了我一个字符串,但它什么也没做”。

解决办法是改用双引号:

perl -p -i.bak -e "s/log/log,XYZ/g" config.txt

或者干脆不使用它们,因为此命令中没有可以被cmd.exe 解释的元字符。

附录

cmd.exe 对任何习惯使用类似sh 的shell 的人来说都是一个非常麻烦的野兽。以下是有关 perl 调用的其他一些常见故障和解决方法。

@REM 不起作用: perl -e“打印” @REM 有效: perl -e "打印" @REM 不起作用: perl -e "print \"你好,世界!\n\"" @REM 有效: perl -e "打印 qq(Hello, world!\n)"

【讨论】:

  • @ephemient 感谢您提供此附录。非常有用。就我而言,perl -e "print \"Hello, world!\n\"" 似乎有效。
【解决方案2】:

ephemient 的回答很好地总结了这个问题,但是您还有另一个选择:将您的外壳从 cmd.exe 更改为更好的外壳。如果您是 Unix 类型的人,那么我建议您查看 Cygwin,它提供了您习惯的那种环境(例如,Bash 和 GNU 实用程序)。

如果您是 Windows 类型的人,我建议您查看 PowerShell(née MSH née Monad)。事实上,即使你是 Unix 类型的人,我也建议你研究一下 PowerShell。它与.NET 集成并具有许多简洁的功能(例如通过管道传递的对象而不是简单的文本行)。如果我被困在 Microsoft 操作系统上,我会使用它。

人们似乎喜欢的其他 Windows 外壳:

【讨论】:

  • 是的,或者只使用双引号。如果这段代码必须在其他机器上运行怎么办?没有什么需要替换 cmd。
  • 一个衬里并不意味着是可移植的代码。 Perl 安装在另一台 Windows 机器上的可能性有多大?此外,如果您是 Windows 用户,那么习惯 PowerShell 可能是一个好主意,因为它是 2008 Server 的一部分。
  • Cmd.exe 非常糟糕,如果它妨碍您的方式足够多,则值得考虑更改外壳程序。另一个外壳值得考虑。 MSYS 和 MinGW 提供了一种比 Cygwin 更轻量级的方式来获得你的 unix 环境。它们也值得研究。 mingw.org
猜你喜欢
  • 2018-03-10
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多