我使用了以下代码从文件中删除行:
File.open("#{$whitelist}-tmp", "w") do |outFile|
File.foreach("#{$whitelist}") do |li|
outFile.puts li unless li.chomp[/A#{instanceId}z/]
@comm = outFile
end
end
FileUtils.mv(@comm, $whitelist)
它工作,但我认为这不是正确的方式去做,因为我不得不创建一个额外的变量'@comm'只是为了从循环中传达文件名。如果我使用'outFile'作为FileUtils的第一个参数。我直接得到一个未定义变量错误。
那么,我应该怎么做呢?
Doc on File.open
如果给出了可选代码块,它将作为参数传递打开的文件,并且当代码块终止时,file对象将自动关闭。 block的值将从File.open返回
所以我们可以这样做
file = File.open("#{$whitelist}-tmp", "w") do |outFile|
File.foreach("#{$whitelist}") do |li|
outFile.puts li unless li.chomp[/A#{instanceId}z/]
end
outFile # return value of the block
end
FileUtils.mv(file, $whitelist)
更新我错过了什么或这段代码只是过滤和重写文件?如果是这样,可以简化得多。
filename = $whitelist
content = File.readlines(filename)
filtered = content.grep(/A#{instanceId}Z/)
File.write(filename, filtered)
最简单的方法是在使用它的块之前分配一个包含文件名的变量:
tempFile = "#{$whitelist}-tmp"
File.open(tempFile, "w") do |outFile|
File.foreach("#{$whitelist}") do |li|
outFile.puts li unless li.chomp[/A#{instanceId}z/
end
end
FileUtils.mv(tempFile, $whitelist)