LINUX.ORG.RU

Ruby, хэши

 ,


0

2

Суть - есть поток строчек, из которых надо вылавливать пары с одинаковым ID и парсить их самым извращённым образом. Фишка в том, что такие пары не обязаны идти подряд (это было бы слишком просто), они могут перемешиваться с другими, хотя могут и идти подряд.

Решил красиво объехать эту неприятность хэшами. В имени ключа сохраняем ID, а в значении - саму строку для будущей обработки. Встречаем такой же ключ - парсим и забываем. Выглядит это так:

ar = Hash.new("")

while true
a=STDIN.gets
a =~ /( блаблабла)/
if ar.key? $2 then # о! да у нас есть строчка с таким ID! парсим

# обработка параметров из "a"

ar[$2] =~ /( блаблабла)/

# обработка параметров из сохранённой строчки

ar.delete($2) #забыли этот ключ

else #нету у нас пока такого ID, надо запомнить его
ar[$2]=a
end

end

Штука в том, что конструкция выборочно парсит где-то половину строк. Логики в том, что именно она скипает, я не вижу. Догадываюсь, что я что-то не понимаю в логике работы хэша. Подскажите, ЧЯДНТ?

★★★★★
Ответ на: комментарий от helios

Уже обрабатывается половина.

Неа. В эту ветку if'а можно попасть ТОЛЬКО когда ID ($2) в считанной строке уже есть в массиве. Соответственно пара обрабатывается и ID удаляется.

Проблема не в скрипте была, всем спасибо.

yu-boot ★★★★★
() автор топика
Ответ на: комментарий от aedeph_

А зачем его забывать?

Чтобы память не текла терабайтами.

yu-boot ★★★★★
() автор топика

УМВР:

# -*- coding: utf-8 -*-

ids = {}

while STDIN.gets do
  if $_ =~ /^\s*id\s*=\s*(\d+)/i # Парсим id
    if ids.key? $1
      # "Обработка:"
      puts "Processing ##{$1}: `#{ids[$1]}' + `#{$_.chomp}'"
      ids.delete($1)
    else
      ids[$1] = $_.chomp
    end
  end
end

Пример:

 Id=52 foo
id =40 bar
ID = 52 foobar
Processing #52: ` Id=52 foo' + `ID = 52 foobar'
id = 52 bar
id = 40 foo
Processing #40: `id =40 bar' + `id = 40 foo'
id = 52 one more time
Processing #52: `id = 52 bar' + `id = 52 one more time'
true

theNamelessOne ★★★★★
()
Ответ на: комментарий от aedeph_

А зачем его забывать?

Наверное, чтобы ID обрабатывались действительно по парам

theNamelessOne ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.