2011-07-05 56 views
2

爲什麼此代碼只修改數組中的最後一個文件?這些文件都可由我的用戶讀取和寫入。搜索/替換奇怪

%w(views/layout.rhtml views/admin/layout.rhtml).each do |file| 
    text = File.read(file) 
    File.open(file, 'w+') do |f| 
    f << text.gsub(/\?v=(\d+)/, "?v=#{$1.to_i + 1}") 
    end 
end 

回答

4

您的問題是你不使用的gsub所以$1以塊的形式,當你認爲它們是相似的全局未設置。從微細手冊:

如果更換是將被替換爲匹配的文本的字符串。它可能包含對\\d形式的模式捕獲組的反向引用,其中d是組號,或\\k<n>,其中n是組名。如果它是一個雙引號字符串,則兩個反引用前都必須加上一個額外的反斜槓。但是,在替換中,特殊匹配變量(如& $)將不會引用當前匹配

和:

在塊形式中,當前匹配字符串傳遞作爲參數,並變量如$1$2$&,和$’將適當地設定。該塊返回的值將被替換爲每次調用的匹配。

銅礦。另外,我離開了反引號全球:

$` 

爲了避免與降價問題(如果有誰知道如何獲得一個反引號中的內聯代碼塊我會很感激的指針)。

如果你這樣做,而不是:

%w(views/layout.rhtml views/admin/layout.rhtml).each do |file| 
    text = File.read(file) 
    File.open(file, 'w+') do |f| 
    f << text.gsub(/\?v=(\d+)/) { "?v=#{$1.to_i + 1}" } 
    end 
end 

我想你會得到你要尋找的結果。

+0

是的,這是有效的,是有道理的。謝謝! –