Ruby String :: gsub! неожиданно останавливается - PullRequest
1 голос
/ 25 июня 2010

Я работаю над ОЧЕНЬ простым скриптом для очистки нескольких сотен тысяч маленьких XML-файлов. Мой текущий метод состоит в том, чтобы перебирать каталог и (для каждого файла) читать файл, использовать String::gsub!, чтобы внести все мои изменения (не уверен, что это лучше), а затем я записываю новое содержимое в файл. Мой код выглядит примерно так:

Dir.entries('.').each do |file_name|

  f = File.read( file_name )

  f.gsub!( /softwareiconneedsshine>(.|\s)*<\/softwareiconneedsshine>/i, '' )
  f.gsub!( /<rating>(.|\s)*<\/rating>, '' )

  f.gsub!( /softwareIdentifiers>/, 'version_history>' )

  #some more regex's

  File.open( file_name, 'w' ) { |w| w.write(f) }

end

Все это выглядит прекрасно и изящно, но по какой-то причине (которую я, по жизни, не могу понять), программа, по-видимому, произвольно зависает над командами gsub!, которые аналогичны первым двум показанным. Тем не менее, он зависает случайно (но только в этих точках). Иногда это работает, иногда просто зависает. Я действительно не могу понять, почему это будет работать иногда, но не все другие времена ???

Любая помощь очень ценится!

1 Ответ

3 голосов
/ 25 июня 2010

Не зная ничего о вашей среде или типе файлов, которые вы читаете, я бы посоветовал попытаться сделать ваши клинские звезды не жадными. Как, изменить (.|\s)* на (.|\s)*?

...