簡體   English   中英

為什么我的 Perl 單線不能在 Windows 上工作?

[英]Why doesn't my Perl one-liner work on Windows?

從 Windows 命令提示符生成一個目錄中所有文件的文本文件:

dir c:\logfiles /B > config.txt

Output:

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 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 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)"

ephemient的回答很好地總結了問題,但您確實有另一個選擇:將 shell 從cmd.exe更改為更好的 shell。 如果您是 Unix 類型的人,那么我建議您研究提供您習慣的那種環境的Cygwin (例如, Bash和 GNU 實用程序)。

如果您是 Windows 類型的人,我建議您查看PowerShell (née MSH née Monad)。 實際上,即使您是 Unix 類型的人,我也建議您研究 PowerShell。 它與.NET集成,並具有許多簡潔的功能(例如對象通過管道而不是簡單的文本行)。 如果我被困在 Microsoft 操作系統上,我會使用 shell。

人們似乎喜歡的 Windows 的其他外殼:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM