Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Изменение содержимого текстовго файла 
:(
    Опции темы
ma_lover
Дата 7.11.2007, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 24.3.2007

Репутация: нет
Всего: нет



Не могли бы вы подсказать, как подсчитать кол-во этих элементов "01 03 0A F0 34" в строке, игнорируя пробелы..
PM MAIL   Вверх
amg
Дата 7.11.2007, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Например, так:
Код

$count++ while $str=~/[\dA-F]{2}/g;

Прошу прощения, корректнее будет уточнить регулярное выражение (два подходящих символа, перед которыми начало строки либо пробел и после которых пробел либо конец строки)
Код

$count++ while $str=~/(?:^|(?<=\s))[\dA-F]{2}(?:(?=\s)|$)/g;


Это сообщение отредактировал(а) amg - 7.11.2007, 13:48
PM MAIL   Вверх
ma_lover
Дата 7.11.2007, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 24.3.2007

Репутация: нет
Всего: нет



не могли бы Вы пояснить значение утверждения "?:".."|", как я понял, обеспечивает одновременный учёт всех условий..



Это сообщение отредактировал(а) ma_lover - 7.11.2007, 14:28
PM MAIL   Вверх
amg
Дата 7.11.2007, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Код

$count++ while $str =~ /
(?:        # открывающая "незахватывающая" скобка
  ^          # начало строки (нулевой длины)
  |          # или
  (?<=\s)    # предшествующий пробел (это выражение нулевой длины)
)          # закрывающая скобка
           # потом идут
[\dA-F]{2} # два нужных символа
           # после них
(?:        # Открывающая "незахватывающая" скобка
  (?=\s)     # последующий пробел (нулевой длины)
  |          # или
  $          # конец строки (нулевой длины)
)          # закрывающая скобка
/xg;


PM MAIL   Вверх
ma_lover
Дата 7.11.2007, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 24.3.2007

Репутация: нет
Всего: нет



amg,Спасибо большое!

PM MAIL   Вверх
ma_lover
Дата 7.11.2007, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 24.3.2007

Репутация: нет
Всего: нет



Такой вопрос..нужно удалить двойные пробелы из строки, точнее заменить их на одинарные.
Всё было бы просто,если бы не тот факт,что нужно сделать это, начиная с определённой точки. Поэтому простая замена не годится..То есть в той же строке "01 03  0A F0  34"нужно заменить двойные пробелы на одинарные, при условии, что первый двойной пробел находится перед "01" и как раз его трогать не нужно..Пока сделал только так:
Код

$temp1=~ s/\s{2}([\dA-F]{2})/\ $1/g;


но он и первый двойной убивает=(

Это сообщение отредактировал(а) ma_lover - 7.11.2007, 17:39
PM MAIL   Вверх
amg
Дата 8.11.2007, 07:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Цитата(ma_lover @  7.11.2007,  17:25 Найти цитируемый пост)
в строке "01 03  0A F0  34" нужно заменить двойные пробелы на одинарные, при условии, что первый двойной пробел находится перед "01" и как раз его трогать не нужно..
Не понял. Зачем приводить в качестве примера строку, не удовлетворяющую твоему же условию?
Код

1 while $temp1 =~ s/(\s\s01.*)\s\s+/$1 /; # ????


PM MAIL   Вверх
ma_lover
Дата 8.11.2007, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 24.3.2007

Репутация: нет
Всего: нет



amg, не понял..чем плох пример?
Дело в том, что в строке могут быть какие угодно комбинации чисел, не обязательно "01".

Это сообщение отредактировал(а) ma_lover - 8.11.2007, 10:31
PM MAIL   Вверх
ma_lover
Дата 8.11.2007, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 24.3.2007

Репутация: нет
Всего: нет



родился вопрос по предыдущему ответу..
Код

$count++ while $str=~/(?:^|(?<=\s))[\dA-F]{2}(?:(?=\s)|$)/g;


каким образом Perl может подсчитать соединения и цифр и букв типа "0A" благодаря выражению "[\dA-F]{2}"? Ведь оно говорит о том, что нужно искать либо символ, либо букву, повторённую дважды..однако сочетания тоже каким-то образом учитываются..
Цитата

К сожалению, я опять не понял вопрос


Попробую подробнее..
Код

$count++ while $str=~/(?:^|(?<=\s))[\dA-F]{2}(?:(?=\s)|$)/g;

Код подсчитывает количество "двойных" символов в строке:B4 DA 25 C5  02 40 1A  00 1E  00  01  00 60  01  0A
Если учесть, что в [\dA-F]{2}, заключённое в квадратные скобки  даёт нам класс символов, то получим, что это выражение должно искать дважды повторённую цифру или букву..Но также нужно учитывать и комбинации цифра-буква и буква-цифра, типа 1E..Судя по результату, это выражение всё же учитывает и комбинации, потому что в счётчике хранится общее количество двойных символов.
Вот я бы и хотел уточнить , почему это так, может я чего-то не понимаю.

Это сообщение отредактировал(а) ma_lover - 8.11.2007, 11:15
PM MAIL   Вверх
amg
Дата 8.11.2007, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Пример плох тем, что вместо прояснения ситуации он ее еще больше запутывает. И пробовать код на такой строке бессмысленно, т.к. она, судя по условию задачи, не должна измениться. Дай, пожалуйста, несколько своих строк и что из них должно получиться.

PS. Это относится к предыдущему посту

Добавлено через 4 минуты и 23 секунды
Цитата(ma_lover @  8.11.2007,  10:50 Найти цитируемый пост)
каким образом Perl может подсчитать соединения и цифр и букв типа "0A" благодаря выражению "[\dA-F]{2}"? Ведь оно говорит о том, что нужно искать либо символ, либо букву, повторённую дважды..однако сочетания тоже каким-то образом учитываются..
К сожалению, я опять не понял вопрос


Это сообщение отредактировал(а) amg - 8.11.2007, 10:53
PM MAIL   Вверх
ma_lover
Дата 8.11.2007, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 24.3.2007

Репутация: нет
Всего: нет



Вот моя исходная строка:
Цитата

14:52:44.230  00  Tx  <HDLC 16><Len  40>  B4 DA 25 C5  02 40 1A  00 1E  00  01  00 60  01  0A  00  02  0A  08 83 10

Начиная,в данном случае, с С5, идут двойные пробелы, которые нужно заменить на одинарные. В то же время весь "заголовок":"14:52:44.230  00  Tx  <HDLC 16><Len  40>  " трогать не нужно, включая и пробел между <Len  40> и B4. Значения всего,кроме заголовка будут меняться, поэтому к ним привязываться бессмысленно.

З.Ы. Получилось полно, но видно иначе было бы неясно, о чём идёт речь.
PM MAIL   Вверх
amg
Дата 8.11.2007, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Цитата(ma_lover @  8.11.2007,  11:05 Найти цитируемый пост)
Вот моя исходная строка: ...
Попробуем так:
Код

# Начиная с конца заменять два и более пробелов на один, до тех пор пока этим пробелам  предшествует 
# комбинация символов, которую удается интерпретировать как двузначное 16-ричное число
1 while $str=~s/(?<=\s[\dA-F]{2})\s\s+(.*)$/ $1/;



Это сообщение отредактировал(а) amg - 8.11.2007, 11:37
PM MAIL   Вверх
ma_lover
Дата 8.11.2007, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 24.3.2007

Репутация: нет
Всего: нет



Цитата

Попробуем так:
Выделить всёкод Perl
    
# Начиная с конца заменять два и более пробелов на один, до тех пор пока этим пробелам  предшествует 
# комбинация символов, которую удается интерпретировать как двузначное 16-ричное число
 while $str=~s/(?<=\s[\dA-F]{2})\s\s+(.*)$/ $1/;



К сожалению выкидывает ошибку:
 
Цитата

syntax error at convert.pl line 40, near "while $str"


Это сообщение отредактировал(а) ma_lover - 8.11.2007, 11:52
PM MAIL   Вверх
amg
Дата 8.11.2007, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Цитата(ma_lover @  8.11.2007,  11:51 Найти цитируемый пост)
К сожалению выкидывает ошибку:

А единичка где?
PM MAIL   Вверх
ma_lover
Дата 8.11.2007, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 24.3.2007

Репутация: нет
Всего: нет



C еденичкой работает, но удаляет пробелы и из заголовка, который трогать нельзя.. Кстати, какую роль играет еденичка??

Вот ещё обновлённый вариант второго вопроса,если что..

Цитата

К сожалению, я опять не понял вопрос


Цитата

Попробую подробнее..

$count++ while $str=~/(?:^|(?<=\s))[\dA-F]{2}(?:(?=\s)|$)/g;

Код подсчитывает количество "двойных" символов в строке:B4 DA 25 C5  02 40 1A  00 1E  00  01  00 60  01  0A
Если учесть, что в [\dA-F]{2}, заключённое в квадратные скобки  даёт нам класс символов, то получим, что это выражение должно искать дважды повторённую цифру или букву..Но также нужно учитывать и комбинации цифра-буква и буква-цифра, типа 1E..Судя по результату, это выражение всё же учитывает и комбинации, потому что в счётчике хранится общее количество двойных символов.
Вот я бы и хотел уточнить , почему это так, может я чего-то не понимаю.


Это сообщение отредактировал(а) ma_lover - 8.11.2007, 12:17
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1325 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.