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

时间:2009-03-19 00:30:11

标签: windows perl

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

我做错了什么?

3 个答案:

答案 0 :(得分:32)

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 doesn't work:
perl -e"print"
@REM works:
perl -e "print"
@REM doesn't work:
perl -e "print \"Hello, world!\n\""
@REM works:
perl -e "print qq(Hello, world!\n)"

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:-3)

Perl脚本可以在Linux shell中运行。也许你没有正确地逃避。