2012-05-18 3 views
1

Я новичок в 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} 

Выход является просто отображение всех файлов. Если я помещаю печать в блок сканирования, я вижу именно то, что хочу. Есть и другие способы сделать это (заполнение внешнего списка), но мне интересно, почему он не работает и если есть рубиновый путь.

ответ

2

Если передать блок scan, он будет возвращать что-то другое, чем если бы вы этого не сделаете:

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

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

Вы должны знать об этом при использовании scan.

Однако, даже лучше, чем ваше текущее решение было бы использовать grep. Вы можете пройти как свое регулярное выражение, так и ваш блок до grep.

+0

хорошо, мне не хватало grep – perusopersonale

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 
0
def get_valid_instr istream 
    istream.grep(/^\s*\w+\s*;\s*\w+\s*$/).map do |instr| 
    instr.upcase.strip.split(";") 
    end 
end 
+0

спасибо, это то, что я искал ... – perusopersonale

Смежные вопросы