2014-07-13 68 views
0

我正在關注Wicked cool ruby​​ scripts book。 這裏, 有兩個文件,file_output = file_list.txt和oldfile_output = file_list.old。這兩個文件包含程序經歷和將要經歷的所有文件的列表。 現在,如果存在'file_list.txt'文件,則該文件將被重命名爲舊文件。 然後,我無法理解代碼。Ruby - 文件 - 獲取方法

顯然文件的每一行都被讀取,並且該行存儲在oldfile散列中。 有人可以從4行解釋嗎?

此外,爲什麼在這裏使用?爲什麼不能使用每種方法來讀取每一行?

if File.exists?(file_output) 
    File.rename(file_output, oldfile_output) 
    File.open(oldfile_output, 'rb') do |infile| 
    while (temp = infile.gets) 
    line = /(.+)\s{5,5}(\w{32,32})/.match(temp) 
    puts "#{line[1]} ---> #{line[2]}" 
    oldfile_hash[line[1]] = line[2] 
    end 
end 
end 
+0

第五行在這裏做什麼? – jarvis11

+0

這個腳本和Wicked Cool完全相反。這太糟糕了。 –

+0

好吧,那很糟糕!請你回答下面的評論! – jarvis11

回答

0

從正則表達式的冗餘使用量詞({5,5}{32,32})的(這將是更好地寫爲{5}{32})來看,它看起來就像是誰寫的代碼是不是專業程序員的Ruby的人。所以你可以假設代碼中的選擇不一定是最好的選擇。

正如您所指出的那樣,代碼本可以使用each而不是whilegets。後一種方法就是一種老派的Ruby方式。使用它沒有任何問題。直到文件結束,gets將返回一個字符串,並且當它到達文件末尾時,gets將返回nil,因此當您使用each時,while循環的工作原理相同;在每次迭代中,它讀取下一行。

看起來每條線都應該表示一個鍵值對。正則表達式假定關鍵字不是空字符串,並且關鍵字和值由5個空格分隔,並且該值由32個字母組成。打印每個鍵值對(可能用於監視進度),並存儲在oldfile_hash中,這很可能是散列。

+0

鍵值?我所得到的是一個文件列表(包括路徑)和一個巨大的32個字母的值。如果我更改了s {}和w {}並再次運行該腳本,則得到的輸出結果相同 – jarvis11

+0

也不會被打印。以及'oldfile_hash = line [1] = line [2]'如何將值存儲到散列? – jarvis11

+0

爲了快速運行程序,腳本首先運行,所有文件的列表都包含在file_list.txt中的MD5散列中。那麼當腳本再次運行時,file_list.txt被重命名爲file_list.old並且創建了新的file_list.txt。 現在把file_list.old拿出來,教行與模式匹配嗎?然後添加到哈希?你能解釋一下這個模式嗎? 在file_list.old中,格式爲 '/dir/dir/dir/file.rb a4434343f3f3f3f3r3343434343ftj6a' – jarvis11

0

所以使用.gets的意義在於告訴文件何時完成讀取。本質上,它與

while (condition) 
     .... 
end 

塊。所以得到的是一個小方法,它會繼續給紅寶石文件的下一行,直到沒有更多的行。