这是我的代码:
List(Of Char)
我想插入与特定字符串匹配的所有行,以tab开头或以空格开头到文件 File.open(file_name) do |file|
file.each_line do |line|;
if line =~ (/SAPK/) || (line =~ /^\t/ and tabs == true) || (line =~ /^ / and spaces == true)
file = File.open("./1.log", "a"); puts "found a line #{line}"; file.write("#{line}".lstrip!)
end
end
end
File.open("./2.log", "a") { |file| file.puts File.readlines("./1.log").uniq }
,所有行应该在开头有空格/制表符,所以我删除了它们。
我想获取1.log
中的唯一行并将其写入1.log
如果有人可以查看代码并告诉我某些内容是否正确,那将会很棒。
在Ruby中使用文件时,2.log
和w+
模式之间有什么区别?
我知道:
w + - 为读写创建一个空文件。
a - 附加到文件。如果文件不存在,则创建该文件。
但是这两个选项都附加到文件中,我虽然a
应该表现得像w+
,而不是>
,所以我猜>>
也喜欢>> ?
谢谢!
答案 0 :(得分:1)
在这段代码中存在很多混淆,并且你没有理由在一条线上干扰事物的习惯没有帮助。尽量保持代码清洁,因为功能应该是显而易见的。还有很多古怪的反模式,如字符串串联和测试布尔值与布尔值,你应该避免这样做。
您需要做的一件事就是在需要中间文件的情况下使用Tempfile
。
这是一个已经清理过的重写版本:
Tempfile.open do |temp|
File.open(file_name) do |input|
input.each_line do |line|
if line.match(/SAPK/) || (line.match(/^\t/) and tabs) || (line.match(/^ /) and spaces)
puts "found a line #{line}"
temp.write(line.lstrip!)
end
end
end
File.open("./2.log", "w+") do |file|
# Rewind the temporary file to read data back
temp.rewind
file.write(temp.readlines.uniq)
end
end
现在a
和w+
大致相似,只是为熟悉任何符号的人提供两种方式。这就像Array有length
和size
这两者做同样的事情。选择一个并一致地使用它,否则你的代码就会混乱。
我对x == true
等内容的批评是因为某些具体内容通常意味着x
可以承担多种价值观,true
是我们正在努力解决的一个特殊情况,暗示我们应该意识到它可能是false
和许多其他事情。这是一个red herring,只会提问。