感謝您的回答,我得出的結論是,我犯了一個很大的錯誤,我再次觸摸perl:幾小時的時間浪費,發現它無法正常完成。 Perl使用不同的方式來分割命令行參數,而不是所有其他使用MS stdlib(在win32上都是標準的)的應用程序。
由於某些命令行參數意圖被解釋爲signle命令行參數,因此perl可以被解釋爲多個參數。這意味着我所要做的就是浪費時間,因爲perl中的錯誤行爲。如果我1)不能像原樣訪問原始命令行,並且2)perl不能正確拆分命令行參數,則無法正確完成此任務。
作爲一個簡單的測試:
script.pl """test |test"
win32上會錯誤解釋命令行:
ARGV=['"test', '|test']
然而,在Windows上正確的 「答案」 必須
ARGV=['"test |test']
我用activestate perl,I t ried也草莓perl的最新版本:都吸。看起來,MSI附帶的perl工作正常,很可能是因爲它是針對mingw而不是cygwin運行時構建的?..
perl的問題和原因是它有錯誤的cmd行解析器,它不起作用在Windows上無論什麼cygwin支持與否。 我有一個簡單的情況下的環境變量(我無法控制)擴展到
perl gcc.pl -c "-IC:\ffmpeg\lib_avutil\" rest of args
的Perl看到的是我有兩個ARGS只:-c和「-IC:\ ffmpeg的\ lib_avutil」 ARGS的其餘 而任何符合Windows實現接收第二個cmd行參數爲:'-IC:\ ffmpeg \ lib_avutil \',這意味着perl是我的簡單情況下的一大堆垃圾,因爲它沒有提供足夠的方法來訪問cmd我最好使用boost :: regex並直接在C++中完成所有的解析工作,至少我不會像ne和!=那樣編寫愚蠢的錯誤來比較字符串等等.Windows的命令行參數的轉義規則是很奇怪,但他們是標準的窗口和Perl因爲一些奇怪的原因不婉轉遵循操作系統的規則。
來源
2010-06-26 08:52:32
PPS
這已經很接近,但我原本選擇,因爲我確實需要從外殼的一些援助,以使用開放:我向前錯誤輸出到標準輸出,然後我將stdout提供給我的腳本。系統(如果它和C中的系統一樣)不允許我處理stdout(除非我用std文件描述符做一些黑魔法技巧),exec也不允許我這樣做(顯然)。 此外,我需要逐行處理(我的程序,我用g ++/gcc編譯非常複雜需要幾秒鐘來編譯每個文件,我需要逐行處理,而不是凍結秒,然後轉儲所有stdout。 – PPS 2010-06-26 06:43:48
那麼,在這一點上,我的決定是否正確地使用open或者我需要查看exec/system調用? 似乎引用規則在windows上並不那麼複雜,似乎我應該親手寫它(對於exmaple,php有一個簡單的api用於shell引用,這對我的情況很有用) – PPS 2010-06-26 06:44:15
open接受一個列表,就像exec和system一樣,除非你的perl非常老了。 – hobbs 2010-06-26 12:47:33