Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Замена символа Конца строки


Автор: shamber 1.9.2008, 16:41
Всем здравствуйте.

Возникла следующая проблемка.
мне неоходимо передавать hash, через STDIN.

как мы уже http://forum.vingrad.ru/forum/topic-225742.html для этой задачи прекрасно Storable freeze и thaw

так вот возникла следующая проблема.
чтение данных происходит следующим образом 
Код

while( $line = <>  ) {
        if($line eq " \n"){
# значит конец передачи
        }else{
#записываем в буфер
push @buffer,$line;
        }
....


Данные я передаю таким образом, чтобы

$buffer->[0]   наименование команды;
$buffer->[1]  данные полученные  с помощью freeze;

Но если после преобразования с помощью freeze в строке будет содержаться символ перевода строки(надеюсь правильно его назвал \n) то  данные лягут также и в  $buffer->[2], чего-бы мне не хотелось.

вообщем я решил использовать такой фокус
перед отправкой заменять
Код

$data =~ s/\r?\n/#!#/g;


а при приеме назад восстанавливать.

Но проблема в том, что это почему-то не всегда срабатывает. В прикрепленом файле номер 1 содержится hash, записанный через store.
т.е.
Код

my $data = freeze $arg;
 store (\$data,'load');

Во втором файле находится находятся данные полученные с помощью
Код

my $data = freeze $arg;
 $data =~ s/\r?\n/#!#/g;
 store (\$data,'loads');

Как видно в обоих файлах есть перевод строки

Как доработать регулярку?

Автор: shamber 1.9.2008, 16:41
Так и не понял как прикрепить второй файл в одно сообщение

Автор: ginnie 1.9.2008, 17:34
Уважаемый shamber, почему не вставить команду внутрь хэша?

Автор: shamber 1.9.2008, 17:45
Уважаемый ginnie,прошу прощения я не совсем понял ваш вопрос. Что вы имеете ввиду?

Автор: ginnie 1.9.2008, 18:01
Я подумал, что лучше обойтись без замены символов конца строки, поэтому предложил поместить значение $buffer->[0] внутрь хэша. При этом читать данные из потока целиком. Похоже, что я был не прав, т.к. не учел, что могут передаваться несколько сериализованных хэшей.

Автор: shamber 1.9.2008, 18:07
ginnie, я не могу уловить вашей идеи smile Не моглы бы Вы показать кодом, как понимать эту фразу

Цитата(ginnie @  1.9.2008,  18:01 Найти цитируемый пост)
поэтому предложил поместить значение $buffer->[0] внутрь хэша. При этом читать данные из потока целиком


Автор: ginnie 1.9.2008, 18:12
До сериализации на стороне отправителя добавлять в хэш ключ c уникальным (для хэша) именем и значением, которое вы передаете перед сериализованным хэшем в Вашем варианте.

Автор: Bulat 2.9.2008, 13:04
shamber, что касается изменения регулярного выражения - два существенных вопроса,

как правило символ перевода каретки - \r, не присутствует в файлах созданных под никсовой платформой(под FreeBSD точно), т.е. в зависимости от операционной системы, нужно правильно обрезать символ конца строки.

И во-вторых, зачем между \r и \n знак вопроса??

Как правило, лично мне, для того чтобы убрать "конец строки" пока достаточно было лишь 
Код

s{[\r\n]}{}


В твоем случае, очевидно

Код

s{[\r\n]}{#!#}


smile

Автор: KSURi 2.9.2008, 22:41
Bulat? как раз обеспечивает кросс-платформенность в данном случае (хотя еще лучше заменить \r и \n на \015 и \012 соответственно).
\r?\n можно прочитать как "один необязательный символ возврата каретки (ноль или один) и один символ перевода строки"

Автор: shamber 3.9.2008, 09:16
KSURi, я правильно понял,что лучше 
Код

 s/\015?\012//g

Автор: KSURi 3.9.2008, 11:07
Ага. Почитать про это можно http://theoryx5.uwinnipeg.ca/CPAN/perl/pod/perlipc/internet_line_terminators.html

Автор: Bulat 3.9.2008, 14:45
Цитата(KSURi @  2.9.2008,  22:41 Найти цитируемый пост)
Bulat, ? как раз обеспечивает кросс-платформенность в данном случае 

Это я потом понял, но сколько лично я не работал, мне всегда было достаточно [\r\n] smile

Автор: gcc 3.9.2008, 16:49
Код

's/\r$//' 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)