2012-02-13 70 views
2

我試着玩草莓Perl,而其中一件讓我難堪的事情是閱讀這些文件。爲什麼此路徑不能在PERL中打開Windows文件?

我試圖做的:

open(FH, "D:\test\numbers.txt"); 

但它無法找到該文件(儘管該文件在那裏,並沒有權限問題)。

等效代碼(文件名以外的其他文件的100%是相同的)在Linux上運行良好。

回答

13

根據Perl FAQ 5,您應該使用轉發斜槓在您的DOS/Windows文件名(或者,作爲替代方案,轉義反斜槓)。

爲什麼我不能在DOS路徑中使用「C:\ temp \ foo」?爲什麼`C:\ temp \ foo.exe`沒有工作?

哎呀!您只需將一個選項卡和一個換頁符放入該文件名即可!請記住,在雙引號字符串(「like \ this」)中,反斜線是一個轉義字符。這些完整列表在perlop中的引用和引用類運算符中。不出所料,您的傳統DOS文件系統上沒有名爲「c:(tab)emp(formfeed)oo」或「c:(tab)emp(formfeed)oo.exe」的文件。

要麼單引號您的字符串,要麼(最好)使用正斜槓。由於所有DOS和Windows版本,因爲像MS-DOS 2.0或類似的東西已經處理/和\相同的路徑,你不妨使用不與Perl衝突 - 或POSIX外殼,ANSI C和C++,awk,Tcl,Java或Python,僅舉幾例。 POSIX路徑也更加便攜。

所以,你的代碼應該是open(FH, "D:/test/numbers.txt");代替,以避免試圖打開一個名爲 「d:<TAB> EST \ numbers.txt」 文件


順便說一句,你可以進一步提高您的

open(my $fh, "<", "D:/test/numbers.txt") or die "Could not open file: $!"; 
:使用詞彙(而不是全局命名)的文件句柄,一個開放的3個參數的形式,而最重要的是,錯誤檢查所有的IO操作,尤其是 open()調用的代碼

或者更好,但不要硬編碼的文件名在IO調用(以下做法可能已經讓你找出問題遲早):

my $filename = "D:/test/numbers.txt"; 
open(my $fh, "<", $filename) or die "Could not open file $filename: $!"; 
+0

+1但是,您究竟發現了這個問題,讀了它並在1分8秒內寫下了答案? – TLP 2012-02-13 18:27:54

+1

@TLP - 前者 - [Feed Notifier](http://meta.stackexchange.com/questions/44545/trilogy-addicts-get-real-time-notifications-of-new-questions)(感謝我剛剛在科幻與幻想SE上獲得了Epic徽章!)+隨機刷新的Perl標籤。對於後者(引用哈利波特) - 純粹的運氣!我已經從一個同事回答100%相同的問題開始了FAQ。在工作中有幫助的回報! :) – DVK 2012-02-13 18:30:37

+0

確實有驚人的表現。 =) – TLP 2012-02-13 18:34:54

1

切勿使用插值的字符串時,你不需要插值!您正嘗試從\ t和\ n打開一個帶有製表符和換行符的文件名。

當你不需要(或想要)插值時使用單引號。

新手Perl程序員似乎遇到的最大問題之一就是他們會自動使用「」而不考慮任何事情。您需要了解「」和「之間的區別,並且您需要始終在打字前進行思考,以便您選擇正確的一個。這是一個很難進入的習慣,但如果你要編寫好的Perl,這一點很重要。

相關問題