2011-07-05 59 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

是的,这是有效的,是有道理的。谢谢! –