![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
1one |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 26.6.2007 Репутация: 1 Всего: 1 |
Как с помощью регекспа заменить метасимволы перевода строки (\n) на _сам_ символ перевода строки (0xA), учитывая перекрывающиеся слеши ('\\\\n' будет '\\n')?
Т.е. сделать вручную то, что автоматически делается, например, строкой print "one\ntwo\\\\nthree" (вывод в STDOUT в двойных кавычках) (на выходе будет one two\\nthree) на примере кода: #!/usr/local/bin/perl -w use strict; print "------ Original:\n"; print "one\ntwo\\\\nthree"; my $str = 'one\ntwo\\\\nthree'; $str =~ s/(?<!\\)\n/\n/; print "------ Code:\n"; print $str; |
|||
|
||||
Nab |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
Так что именно должно получиться то?
Приведите пример выходной строки. -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
|||
|
||||
nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
вариантов много - один из них:
|
|||
|
||||
1one |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 26.6.2007 Репутация: 1 Всего: 1 |
например, есть строка 'one\ntwo\\nthree\\\nfour\\\\nfive' на выходе будет: one two\nthree\ four\\nfive т.е. то же самое, если бы вы вывели print "one\ntwo\\nthree\\\nfour\\\\nfive"; |
|||
|
||||
nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
а если бэкслеш как символ, то так:
З.Ы.: ответьте на вопрос Nab - для уточнения Добавлено через 1 минуту и 14 секунд вооо - теперь понято стало =) |
|||
|
||||
Nab |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
nitr, ты чего? самый простой способ, это:
![]() -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
||||||
|
|||||||
nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
Nab, уверен?
![]() |
|||
|
||||
1one |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 26.6.2007 Репутация: 1 Всего: 1 |
Nitr, Nab - не верно.
"$str" \n, которые уже были в $str не заменит на символы перевода строки $str =~ s/[\\]+n/\n/g; - сотрет все предыдущие слеши (а надо их оставить) повторюсь: нужно сделать в точности так, как происходит вывод в STDOUT в двойных кавычках. но нужно вывести не print "one\ntwo\\nthree\\\nfour\\\\nfive"; , а $str = '"one\ntwo\\nthree\\\nfour\\\\nfive"'; #здесь махинации по преобразованию двойных слешей в одинарные, и \n на 0xA (код симв. перевода строки) print "$str"; |
|||
|
||||
Nab |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
неееее, стыдно... :( потому проверил, и могу сказать что задача не решаема в принципе ![]() потому как интерпретация обратного слеша происходит и в одиночных кавычках... то есть
выведет для обоих переменных одинаковый результат... что означает в случае строки $str = 'one\ntwo\\nthree`, что она будет иметь вид
дельнейшая обработка безсмысленна, потому как утеряна важная информация, и при интерполяции каким либо способом и первая \n и вторая дадут одинаковое вхождение... Здесь нужна предварительная обработка входных данных, тех которые ниразу не прошли интерпретацию процессором перла... -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
||||
|
|||||
1one |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 26.6.2007 Репутация: 1 Всего: 1 |
2 Nab:
> Здесь нужна предварительная обработка входных данных, тех которые ниразу не прошли интерпретацию процессором перла... Данные препроцессором перла не проверяются изначально. Я выразился "так, как при выводе метасимволов в STDOUT в двойных кавычках" всего-лишь для того, чтобы было понятнее. перефразирую мою задачку так: Метасимволами являются '\' и '\n'. В свою эчередь, их можно экранировать (чтобы они не обрабатывались как спец. символы), поставив перед ними еще один слеш. Как сделать так, чтобы двойные слеши менялись на одинарные, а \n - на символ перевода строки. Причем замены эти, я так понял, должны идти только строго последовательно, тогда и получится "так, как в выводе в двойн. каычках в STDOUT" Т.е. есть у нас \\\\\\n получим \\\n (двойные слеши заменились одинарными, а для n, в свою очередь, не осталось слеша впереди (т.к. поиск на предмет замен идет попарно по 2 символа), поэтому преобразование в символ перевода строки произведено не было). ----- Вот и не соображу, как это регекспом выразить... |
|||
|
||||
Nab |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
а зачем?
Проще эту работу поручить перлу...
-------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
|||
|
||||
dimes |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 249 Регистрация: 20.7.2004 Где: то около СПБ Репутация: нет Всего: 14 |
Nab,
Главное что бы в тексте не встречалась спецуха типа '$' ![]() По-моему первый вариант предложенный nitr, "$str =~ s/[\\]+n/\n/g;" вполне жизнеспособный и быстрый. Или я что то не понимаю? |
|||
|
||||
Nab |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
ну эт уже проблемы другого плана ![]()
не совсем, где сказано что в конце по любому 'n' ? и потом ему нужно пару '\\' превратить в одну, а не убить их всех одним махом ![]() Я так понял требуеться для общего случая, когда и такое может случиться: 'aaa\\\n\\\\bb'... -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
|||
|
||||
1one |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 26.6.2007 Репутация: 1 Всего: 1 |
вот-вот... эхх.. |
|||
|
||||
1one |
|
||||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 26.6.2007 Репутация: 1 Всего: 1 |
Это был бы действительно вариант, если бы не интерпретация и других спецсимволов в том числе - а то, да, может по ошибке и еще какое-нибудь значение левой переменной залезть в результат. |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |