为什么我的Perl不能在Windows上运行?

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的无效上下文中无用的常量。

我究竟做错了什么?

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式炮弹的人来说。 以下是关于perl调用的其他一些常见故障和解决方法。

 @REM不起作用:
 perl -e“打印”
 @REM作品:
 perl -e“打印”
 @REM不起作用:
 perl -e“print \”Hello,world!\ n“”
 @REM作品:
 perl -e“print qq(Hello,world!\ n)”

ephemient的答案很好的总结了这个问题,但是你有另外的选择:把你的shell从cmd.exe改到更好的shell。 如果你是Unix类型的人,那么我会建议看看Cygwin ,它提供了你习惯的环境(例如Bash和GNU工具)。

如果你是一个Windows类型的人,我会建议看看PowerShell (néeMSHnéeMonad)。 事实上,即使你是Unix类型的人,我也会建议寻找PowerShell。 它与.NET集成,并有许多整洁的功能(如通过管道传递的对象而不是简单的文本行)。 如果我被困在一个Microsoft操作系统上,那就是我将要使用的shell。

人们似乎喜欢的Windows的其他shell:

  • UWIN
  • MinGW的
  • UnixUtils
  • 用于UNIX的Microsoft Windows服务(SFU)
  • MKS工具包

Perl脚本从Linux shell运行。 也许你没有正确地逃避某些事情。