ruby匹配字符串开头处的字符串或空格/制表符,并将uniq行插入文件

时间:2016-09-25 00:40:46

标签: ruby

这是我的代码:

List(Of Char)
  1. 我想插入与特定字符串匹配的所有行,以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 } ,所有行应该在开头有空格/制表符,所以我删除了它们。

  2. 我想获取1.log中的唯一行并将其写入1.log

  3. 如果有人可以查看代码并告诉我某些内容是否正确,那将会很棒。

  4. 在Ruby中使用文件时,2.logw+模式之间有什么区别?

  5. 我知道:

      

    w + - 为读写创建一个空文件。

         

    a - 附加到文件。如果文件不存在,则创建该文件。

    但是这两个选项都附加到文件中,我虽然a应该表现得像w+,而不是>,所以我猜>>也喜欢>> ?

    谢谢!

1 个答案:

答案 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

现在aw+大致相似,只是为熟悉任何符号的人提供两种方式。这就像Array有lengthsize这两者做同样的事情。选择一个并一致地使用它,否则你的代码就会混乱。

我对x == true等内容的批评是因为某些具体内容通常意味着x可以承担多种价值观,true是我们正在努力解决的一个特殊情况,暗示我们应该意识到它可能是false和许多其他事情。这是一个red herring,只会提问。