我是Java / C ++程序员,Ruby是我的第一个脚本语言。我有时会发现我并没有像在某些方面那样富有成效地使用它,比如这个:
目标:仅解析文件中的某些行。我想要的模式是有一条非常大的线,大小超过15,其余的线肯定更小。我想忽略之前(包括)大行的所有行。
def do_something(str)
puts str
end
str =
'ignore me
me too!
LARGE LINE ahahahahha its a line!
target1
target2
target3'
flag1 = nil
str.each_line do |line|
do_something(line) if flag1
flag1 = 1 if line.size > 15
end
我写了这个,但我认为它可以写得好多了,也就是说,必须有一个比设置标志更好的方法。关于如何编写漂亮的Ruby系列的建议也欢迎。
注意/澄清:我需要在第一次出现LARGE LINE后打印所有行。
答案 0 :(得分:10)
str.lines.drop_while {|l| l.length < 15 }.drop(1).each {|l| do_something(l) }
我喜欢这个,因为如果你从左到右阅读它,它几乎就像你原来的描述一样:
将字符串拆分为行并删除短于15个字符的行。然后删除另一行(即第一行超过14个字符)。然后对剩下的每一行做点什么。
您甚至不需要一定了解Ruby,也不需要编写 来验证这是否正确。
答案 1 :(得分:3)
require 'enumerator' # Not needed in Ruby 1.9
str.each_line.inject( false ) do |flag, line|
do_something( line ) if flag
flag || line.size > 15
end
答案 2 :(得分:1)
lines = str.split($/)
start_index = 1 + lines.find_index {|l| l.size > 15 }
lines[start_index..-1].each do |l|
do_something(l)
end