Ruby 使用grep编写数组

Ruby 使用grep编写数组,ruby,arrays,grep,Ruby,Arrays,Grep,我正在尝试搜索指定的字符串并将结果分配给数组。 打开并写入“input.txt”和“ms3.txt”文件效果良好。放置一个普通字符串,如重新分配,您的代码有几个问题: #!/usr/bin/ruby # encoding: utf-8 reassign = [] File.foreach("input.txt") do |line| reassign << line[/[abc]/] end File.write("ms3.txt", reassign.join("\n"))

我正在尝试搜索指定的字符串并将结果分配给数组。

打开并写入“input.txt”和“ms3.txt”文件效果良好。放置一个普通字符串,如
重新分配,您的代码有几个问题:

#!/usr/bin/ruby
# encoding: utf-8

reassign = []
File.foreach("input.txt") do |line|
  reassign << line[/[abc]/]
end

File.write("ms3.txt", reassign.join("\n"))
  • 您可以使用打开模式
    “w+”
    打开
    “input.txt”
    。根据,这会将文件长度截断为零。空文件不包含任何行,因此,
    文件。每行都不会调用块

    如果要从文件中读取,请使用默认的
    “r”

    file = File.open("input.txt")
    
  • 您不关闭
    文件
    。使用自动关闭文件的块形式:

    File.open("input.txt") do |file|
      # ...
    end
    
  • line
    是一个
    String
    并且没有
    String\grep
    方法。但由于
    文件
    包括
    可枚举
    ,因此您可以使用:

  • 一个完整的例子:

    File.open("input.txt") do |file|
      reassign = file.grep(/[abc]/)
    
      File.open("ms3.txt", "w+") do |new_file|
        new_file.puts(reassign)
      end
    end
    

    您的代码可以进行大量简化,使其更像Ruby,并使其表现得更好:

    # encoding: utf-8
    #!/usr/bin/ruby
    
    file = File.open("input.txt", "w+")
    
    reassign = []
      file.each_line do |line|
        reassign << line.grep(/[abc]/)
        end
    
    new_file = File.open("ms3.txt", "w+")
    new_file.puts(reassign)
    new_file.close
    
    但是,在重构之后,我会得到:

    #!/usr/bin/ruby
    # encoding: utf-8
    
    File.open('ms3.txt', 'w') do |fo|
      fo.puts File.foreach('input.txt').grep(/[abc/])
    end
    
  • open
    使用块打开输出文件,以便在块退出时自动关闭文件
  • foreach
    是一个迭代器,通常与块一起使用,将读取的每一行传递到块中。相反,我让读者阅读找到的所有线条并搜索模式
  • grep
    找到的与模式匹配的任何行都将作为数组返回到
    put
    ,该数组将对它们进行迭代,并在每个行的末尾追加
    “\n”
  • fo.put
    put
    的输出定向到输出文件
  • end
    导致块退出,从而导致
    open
    关闭文件

  • 这是未经测试的,但看起来是正确的。

    非常有效,非常感谢!正如你所知,我是一个完全的初学者,我不知道你在“| |”括号之间放了什么其实很重要,我以为它只是一个替身,如果这有意义的话,再次感谢你!不客气!别忘了投票选出有帮助的答案。如果我的答案解决了你的问题,你甚至可能想把它标记为接受。哇,谢谢你,你让它看起来很简单。你知道在Ruby中使用正则表达式吗。我的搜索而不是“[abc]”是“*?(\n.*?+”,但它在我到达“这是一个完全不同的问题,需要单独提问,而不是作为评论。要解析HTML/XML,需要使用解析器,而不是正则表达式。查看,搜索标记的问题,自己动手解决问题,如果仍然有问题,请寻求帮助。我不确定我是否正在尝试解析它(如果我正确理解解析的含义),我只需要搜索并替换,或者在本例中从包含HTML的文本文档中提取,这与解析相同吗?不,这不是使用解析器。XML/HTML太复杂,无法使用常规搜索/替换,因为正则表达式无法轻松处理标记。相反,通过Nokogiri使用类似libXML的解析器,我们可以很容易地找到节,提取/删除/添加/修改包含文本的元素,甚至重写更改后的XML/HTML。你可以试着做捷径,但最终你会被咬,所以你最好从正确的方式开始。
    #!/usr/bin/ruby
    # encoding: utf-8
    
    reassign = []
    File.foreach("input.txt") do |line|
      reassign << line[/[abc]/]
    end
    
    File.write("ms3.txt", reassign.join("\n"))
    
    #!/usr/bin/ruby
    # encoding: utf-8
    
    File.open('ms3.txt', 'w') do |fo|
      fo.puts File.foreach('input.txt').grep(/[abc/])
    end