2015-02-20 5 views
0

Мне нужно найти каждое вхождение «$» и изменить его на число, используя счет. например str = "foo $ bar $ foo $ bar $ * run code here * => "foo 1 bar 2 foo 3 bar 4нет Ошибки, но нет результата

Похоже, это должно быть намного проще, чем я делаю это. Вот мой код:

def counter(file) 
    f = File.open(file, "r+") 
    count = 0 
    contents = f.readlines do |s| 

    if s.scan =~ /\$/ 
     count += 1 
     f.seek(1) 
     s.sub(/\$/, count.to_s) 
    else 
     puts "Total changes: #{count}" 
    end 
    end 
end 

Однако я не уверен, если я хотел использовать .match, .scan, .find или что-то еще.

Когда я запускаю это, он не вызывает никаких ошибок, но он ничего не меняет.

+0

Похоже, что вам не хватает петли. –

+0

Где вы отправляете вывод? В дополнение к отсутствию цикла, вы, кажется, не выводят результаты подстановки нигде. – lurker

ответ

1

Ваш синтаксис для scan является неправильным и должен вызывать ошибку.

Вы можете попробовать что-то вдоль этой линии:

count = 0 
str = "foo $ bar $ foo $ bar $ " 
occurences = str.scan('$') 
# => ["$", "$", "$", "$"] 
occurences.size.times do str.sub!('$', (count+=1).to_s) end 
str 
# => "foo 1 bar 2 foo 3 bar 4 " 

Объяснения: Я нахожу все вхождения $ в строке, то я использую sub! в итерации, поскольку он заменяет только первое вхождение в время.

Примечание: Вы можете улучшить scan линию, используя регулярные выражения с границей матча вместо простого "$", как он заменит $ даже в словах. Например: exa$mple также заменит на что-то вроде: exa1mple

Почему ваш код не выбрасывает ошибку?

Если вы читали описание readlines, вы найдете:

читает весь файл, указанный в качестве имени отдельных линий, и возвращает эти строки в массиве.

Поскольку он считывает весь файл сразу, этот метод не пропускает значение. Следующий пример сделает его более ясным:

contents = f.readlines do |s| 
    puts "HELLO" 
end 
# => ["a\n", "b\n", "c\n", "d\n", "asdasd\n", "\n"] #lines of file f 

Как вы можете видеть «HELLO» никогда не печатается, показывая блок кода никогда не выполняется.

+1

ах я вижу, спасибо за объяснение, он отлично работает – Rebs

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