2009-06-10 64 views
1

我寫了一個Perl腳本,它打開一個由各種文件組成的目錄。看起來,腳本不會以任何順序讀取文件(不是按字母順序排列,也不是大小寫),而是隨機讀取它們。我想知道背後的原因是什麼?爲什麼Perl腳本以隨機順序從目錄中讀取文件?

+10

我們不是通靈;你可以發佈一些代碼嗎? – 2009-06-10 20:47:02

回答

11

這是從來沒有隨機的,它只是在你不認識的模式。如果您查看描述您用來讀取目錄的任何函數的實現的文檔,它可能會這樣說,並不能保證讀取文件的順序。

如果你需要它們按照特定的順序,你對它們進行操作之前的名稱進行排序。

的文件在這方便的底層文件系統中的訂單可能讀取。所以,從某種意義上說,這些文件是有序的,但不是按照您期望的順序(大小或字母)。有時候,文件有一個內部的數字ID,並且這些文件可能以這個ID的數字順序返回。但是,這個ID是你可能不會經常遇到的東西,如果有的話。

同樣,結果是有序的,而不是隨機的。他們只是在你沒有預料到的順序。如果您需要訂購它們,請明確訂購。

參見:http://www.perlmonks.org/?node_id=175864

10

它根據他們存儲在文件中的目錄的列表中的順序可能閱讀它們。在某些類似Unix的文件系統上,目錄本質上是一個無序的文件名和inode指向內容的列表(這是非常簡化的)。

+3

有些編輯甚至會讓你編輯目錄文件,儘管你必須瞭解結構才能看到它的內容。 :) – 2009-06-11 01:43:43

2

如果你的腳本使用opendir()(直接或間接),你不能假設它返回文件的順序排序任何東西;它將取決於您正在訪問的操作系統和文件系統的類型。有幾個選項是:

  1. 使用兩個循環:一個讀取所有文件名,第二個按照您需要的順序處理它們。
  2. 使用其他一些命令(如調用「ls」)強制在您需要的順序來返回的文件名。
+3

在Perl中,除非你想做一個不平凡的排序,否則你會把名字讀入一個數組中並對數組進行排序,而不是使用'ls'(即使這樣,你會考慮是否使用Perl)。 – 2009-06-10 21:10:31

+3

千萬不要低估調用程序的開銷。 – 2009-06-11 04:53:14

4

目錄條目並不存儲在有序和你不應該假設它們存儲的方式。如果你想對它們進行排序,你必須對它們進行排序。例如,比較以下輸出:

perl -e 'opendir DIR, "."; print join("\n", sort readdir(DIR)); print "\n";' 

perl -e 'opendir DIR, "."; print join("\n", readdir(DIR)); print "\n";' 
相關問題