嵌套扫描块在选择块内

时间:2012-05-18 12:50:15

标签: ruby

我是Ruby的新手,我想从匹配正则表达式的文件中选择一些行然后存储到列表中。

所以我写下面的代码:

    def get_valid_instr istream
         p istream.select { |line| line.scan(/(^\s*\w+\s*;\s*\w+\s*$)/){|instr| instr[0].upcase.strip.split(";")}}
    end

   trace_instr = File.open("#{file_name}", "r"){|stream|  get_valid_instr stream}

输出只是所有文件的显示。 如果我在扫描块中打印,我会看到我想要的。 还有其他方法可以做到这一点(填写外部列表),但我想知道为什么它不起作用,如果有红宝石的方式。

3 个答案:

答案 0 :(得分:2)

如果您将一个块传递给scan,它将返回与您不相同的内容:

"abc".scan(/./)
# => ["a", "b", "c"]

"abc".scan(/./) {|l| puts l }
# a
# b
# c
# => "abc"

使用scan时需要注意这一点。

然而,比您当前的解决方案更好的是使用grep。您可以将两者正则表达式和块传递给grep

答案 1 :(得分:0)

查看要测试的一些数据会很有帮助。

数据是否按行拆分?我不确定你用分号分裂。这是什么原因?如果您可以发布一些示例数据和一些示例输出,我将能够进一步提供帮助。

这是我试图解释你想要实现的目标,但它可能会很好,因为我没有看到真正的数据。谢谢!

def get_valid_instr(lines)
  regex = /(^\s*\w+\s*;\s*\w+\s*$)/
  lines.inject([]) do |matched_lines, line| 
    if match = line.match(regex)
      p match[0]
      matched_lines << match[0].upcase.strip.split(";") 
    end
    matched_lines
  end
end
trace_instr = get_valid_instr(File.readlines(file_name))
pp trace_instr

答案 2 :(得分:0)

def get_valid_instr istream
  istream.grep(/^\s*\w+\s*;\s*\w+\s*$/).map do |instr|
    instr.upcase.strip.split(";")
  end
end