![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| MZ412 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 4.12.2009 Репутация: нет Всего: нет |
Приветствую.
Решаю маленькую задачу по парсингу текста. Есть код:
Скажем так, я гарантировано знаю, что подстрока будет ограничена символом ' Всё, что я нагуглил и начитал в учебнике говорит мне о том, что для извлечения подстроки из строки надо использовать функции index и rindex. Но есть у меня подозрение, что это решение не изящно. Не подскажете, в какую сторону копать? Наверняка же можно записать всё в виде
и вытащить из какой-нибудь системной переменной... Это сообщение отредактировал(а) MZ412 - 22.1.2010, 12:04 |
||||
|
|||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
можно.
у вас задача какая? |
|||
|
||||
| mastercz |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 5.11.2008 Репутация: нет Всего: нет |
может като так ?
@substr = $str =~ m/\'.*?\'/g; |
|||
|
||||
| sir_nuf_nuf |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 14 Всего: 31 |
или
или ну вы поняли.. |
||||
|
|||||
| MZ412 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 4.12.2009 Репутация: нет Всего: нет |
Всех благодарю. Прицип понял. )
|
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
sir_nuf_nuf, может правильнее так:
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| MZ412 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 4.12.2009 Репутация: нет Всего: нет |
Если немного развить тему...
Суть самой задачи - извлечение из весьма кривого лога (нет возможности переписать) хэш массива с данными. Сам лог выглядит так:
Да, именно так, с переводами строки. Т.е. каждая "строка" лога - вот такое вот безобразие. Собственно требуется наполнить хэш массив вида
speed - это значение в одинарных кавычках. data - это последняя цифра (время в unix формате), в данном примере - 1264154697. Я правильно вижу ситуацию, что самый простой вариант - считать в скаляр такой вот блок информации, удалить все переводы строки и работать, как с простой строкой, изврекая regexp-ом нужные фрагменты и записывая их в хэш массив? |
||||
|
|||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
MZ412, если набор данных в исходном файле постоянный, зачем сначала их объединять, а затем выбирать из них нужные при помощи рег. выражений? Почему нельзя сразу считать нужные значения?
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| mastercz |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 5.11.2008 Репутация: нет Всего: нет |
|
|||
|
||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
perl -073 -lne 'eval $_ && push @ary,{ speed => $stat->[2], data => $stat->[4] }'
|
|||
|
||||
| MZ412 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 4.12.2009 Репутация: нет Всего: нет |
2ginnie
Правильно ли я понял идею? Считываю построчно файл. Учитывая то, что оба значения, которые меня интересуют, чередуются в определённом порядке, то я просто сверяю с regexp-ами для каждого поочерёдно каждую строку, и, в случае попадания пишу данные в хэш? 2mastercz
Силюсь понять, честно. Но что находиться в переменной $stat ? Считанная строка? 2arto Выполнять в shell-e мне не хотелось бы, т.к. буду потом эти данные в RRD бызу загонять и графики строить. Это сообщение отредактировал(а) MZ412 - 22.1.2010, 14:05 |
||||
|
|||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
MZ412, поняли правильно. Я бы сверял только '$stat = [', чтобы контролировать, что файл единообразный. Регулярные выражения я бы использовал для удаления переноса строк и запятых с кавычками.
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| MZ412 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 4.12.2009 Репутация: нет Всего: нет |
В общем - рашил это так:
|
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
MZ412, и что, это у Вас правильно работает?
Кстати, вместо m/^.+'(([0-9]|.)+)'.+$/ лучше написать m/^.+'([\d.]+)'.+$/ Это сообщение отредактировал(а) ginnie - 22.1.2010, 15:37 -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| MZ412 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 4.12.2009 Репутация: нет Всего: нет |
Работает, т.к. единственная трабла была с нулевой скоростью. Про улучшение регекспа понял, благодарю. Действительно более логично. |
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |