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