![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
ma_lover |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 24.3.2007 Репутация: нет Всего: нет |
Помогите решить проблем..Нужно считать инфу из текстового файла, модифицировать её и записать в другой текстовый файл..Модифицировать-поменять регистр с нижнего на верхний+провести замену некоторых символов на другие, добавить поле вычисления длины и так далее в том же духе...Пока добился того, что во второй файл пишет инфу в верхнем регистре, но..упорно не хочет заменять.И ещё подскажите, зачем в цикле while-к примеру- указывать явное соответсвие дескриптора-файлу, когда во всех книгах пишут, что они итак взаимно однозначны? пробовал без этого-не заработало, пока не поменял.Подскажите , плиз, ибо книги подробной инфы не дают.
Спасибо.Ниже код: #! usr/bin/perl -w $file_in="in.txt" unless defined $file_in; $file_out="out.txt" unless defined $file_out; printf "Opening file for conversion...\n"; open(INFILE,'<',$file_in) or die ("Cannot open file: $!"); open(OUTFILE, '+>',$file_out) or die ("Can't open output file: $!"); register_change($file_in,$file_out); # Change every symbol's register to UP sub register_change{ while ($file_in=<INFILE>) { print OUTFILE $file_out=uc($file_in); $file_out=~ tr/S/T/; } } close INFILE or die ("Cannot close file: $!"); close OUTFILE or die ("Cannot close file: $!"); print "Successful conversion.\n"; |
|||
|
||||
BlackLFL |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 15.9.2005 Где: Москва Репутация: 8 Всего: 12 |
Это сообщение отредактировал(а) BlackLFL - 1.11.2007, 17:18 |
|||
|
||||
ma_lover |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 24.3.2007 Репутация: нет Всего: нет |
После долгих мучений справился сам вот таким образом:
|
|||
|
||||
ma_lover |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 24.3.2007 Репутация: нет Всего: нет |
Возник правда ещё один вопрос.Каким образом можно в строку с определённой точки в тсроке вставить набор символов и каким образом их потом подвигать по надобности?
|
|||
|
||||
BlackLFL |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 15.9.2005 Где: Москва Репутация: 8 Всего: 12 |
|
|||
|
||||
ma_lover |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 24.3.2007 Репутация: нет Всего: нет |
Не знаю пока как substr поможет..нужно найти в файле все числа: 1 3 F0 34 0 1 итд. и к тем, который записываются только 1 символом, добавить нули, то есть так, чтобы стало: 01 03 F0 34 00 01...
|
|||
|
||||
KSURi |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 887 Регистрация: 8.6.2006 Где: Russia Репутация: 20 Всего: 27 |
-------------------- Died at Life.pl line 21 |
|||
|
||||
ma_lover |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 24.3.2007 Репутация: нет Всего: нет |
добавляет в данном случае нули везде, даже там , где они не нужны.. |
|||
|
||||
BlackLFL |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 15.9.2005 Где: Москва Репутация: 8 Всего: 12 |
тогда может опишете более подробно, что Вам нужно?
|
|||
|
||||
amg |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
Может, так?
|
|||
|
||||
ma_lover |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 24.3.2007 Репутация: нет Всего: нет |
amg, спасибо,Вы предложили то, что нужно, только вот ещё и шестнадцатиричные символы нужно учесть..то есть может быть строка:
1 3 А F0 34 0 1..тогда в результате она заменится на строку 01 03 0A F0 34 00 01. BlackLFL, вот более менее подробно, что требуется: нужно найти в файле все числа: 1 3 A F0 34 0 1 итд. и к тем, которые записываются только 1 символом, добавить нули, то есть так, чтобы стало: 01 03 0A F0 34 00 01... Это сообщение отредактировал(а) ma_lover - 5.11.2007, 12:20 |
|||
|
||||
amg |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
||||
|
||||
ma_lover |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 24.3.2007 Репутация: нет Всего: нет |
amg, заменил-но не сработало, никаких изменений со строкой не произошло.=-(
Это сообщение отредактировал(а) ma_lover - 5.11.2007, 13:42 |
|||
|
||||
amg |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
Должно работать!
Добавлено через 10 минут и 55 секунд Эти три регулярки можно объединить:
|
||||
|
|||||
ma_lover |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 24.3.2007 Репутация: нет Всего: нет |
amg, прошу прощения, всё действительно работает.Это я , по неопытности, []- опустил, с ними всё ок.Спасибо!
![]() |
|||
|
||||
ma_lover |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 24.3.2007 Репутация: нет Всего: нет |
Не могли бы вы подсказать, как подсчитать кол-во этих элементов "01 03 0A F0 34" в строке, игнорируя пробелы..
|
|||
|
||||
amg |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
Например, так:
Прошу прощения, корректнее будет уточнить регулярное выражение (два подходящих символа, перед которыми начало строки либо пробел и после которых пробел либо конец строки)
Это сообщение отредактировал(а) amg - 7.11.2007, 13:48 |
||||
|
|||||
ma_lover |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 24.3.2007 Репутация: нет Всего: нет |
не могли бы Вы пояснить значение утверждения "?:".."|", как я понял, обеспечивает одновременный учёт всех условий..
Это сообщение отредактировал(а) ma_lover - 7.11.2007, 14:28 |
|||
|
||||
amg |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
|
|||
|
||||
ma_lover |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 24.3.2007 Репутация: нет Всего: нет |
amg,Спасибо большое!
|
|||
|
||||
ma_lover |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 24.3.2007 Репутация: нет Всего: нет |
Такой вопрос..нужно удалить двойные пробелы из строки, точнее заменить их на одинарные.
Всё было бы просто,если бы не тот факт,что нужно сделать это, начиная с определённой точки. Поэтому простая замена не годится..То есть в той же строке "01 03 0A F0 34"нужно заменить двойные пробелы на одинарные, при условии, что первый двойной пробел находится перед "01" и как раз его трогать не нужно..Пока сделал только так:
но он и первый двойной убивает=( Это сообщение отредактировал(а) ma_lover - 7.11.2007, 17:39 |
|||
|
||||
amg |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
|
||||
|
|||||
ma_lover |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 24.3.2007 Репутация: нет Всего: нет |
amg, не понял..чем плох пример?
Дело в том, что в строке могут быть какие угодно комбинации чисел, не обязательно "01". Это сообщение отредактировал(а) ma_lover - 8.11.2007, 10:31 |
|||
|
||||
ma_lover |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 24.3.2007 Репутация: нет Всего: нет |
родился вопрос по предыдущему ответу..
каким образом Perl может подсчитать соединения и цифр и букв типа "0A" благодаря выражению "[\dA-F]{2}"? Ведь оно говорит о том, что нужно искать либо символ, либо букву, повторённую дважды..однако сочетания тоже каким-то образом учитываются..
Попробую подробнее..
Код подсчитывает количество "двойных" символов в строке: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 |
||||||
|
|||||||
amg |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
Пример плох тем, что вместо прояснения ситуации он ее еще больше запутывает. И пробовать код на такой строке бессмысленно, т.к. она, судя по условию задачи, не должна измениться. Дай, пожалуйста, несколько своих строк и что из них должно получиться.
PS. Это относится к предыдущему посту Добавлено через 4 минуты и 23 секунды К сожалению, я опять не понял вопрос Это сообщение отредактировал(а) amg - 8.11.2007, 10:53 |
|||
|
||||
ma_lover |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 24.3.2007 Репутация: нет Всего: нет |
Вот моя исходная строка:
Начиная,в данном случае, с С5, идут двойные пробелы, которые нужно заменить на одинарные. В то же время весь "заголовок":"14:52:44.230 00 Tx <HDLC 16><Len 40> " трогать не нужно, включая и пробел между <Len 40> и B4. Значения всего,кроме заголовка будут меняться, поэтому к ним привязываться бессмысленно. З.Ы. Получилось полно, но видно иначе было бы неясно, о чём идёт речь. |
|||
|
||||
amg |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
Попробуем так:
Это сообщение отредактировал(а) amg - 8.11.2007, 11:37 |
|||
|
||||
ma_lover |
|
||||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 24.3.2007 Репутация: нет Всего: нет |
К сожалению выкидывает ошибку:
Это сообщение отредактировал(а) ma_lover - 8.11.2007, 11:52 |
||||
|
|||||
amg |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
||||
|
||||
ma_lover |
|
||||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 24.3.2007 Репутация: нет Всего: нет |
C еденичкой работает, но удаляет пробелы и из заголовка, который трогать нельзя.. Кстати, какую роль играет еденичка??
Вот ещё обновлённый вариант второго вопроса,если что..
Это сообщение отредактировал(а) ma_lover - 8.11.2007, 12:17 |
||||
|
|||||
amg |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
Понятно. [\dA-F] - это символ, представляющий собой цифру или букву (от A до F), порядок перечисления внутри квадратных скобок не важен. [\dA-F]{2} - это два таких символа. |
||||
|
|||||
ma_lover |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 24.3.2007 Репутация: нет Всего: нет |
Да, работает, спасибо!
Это сообщение отредактировал(а) ma_lover - 8.11.2007, 14:27 |
|||
|
||||
ma_lover |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 24.3.2007 Репутация: нет Всего: нет |
Можно только небольшое пояснение по поводу работы оператора s/ / /...Насколько пишут в книгах, он заменяет одно поле другим...то есть в нашем случае:
$1 должно была бы заменить последовательность из двух шестнадцатиричных символов с сопровождающими их пробелами..В данном случае этому препятствует символ отрицания захвата":?" или как?.Можно пояснить?. Спасибо. |
|||
|
||||
amg |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |