![]() |
Модераторы: 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 |
Это был бы действительно вариант, если бы не интерпретация и других спецсимволов в том числе - а то, да, может по ошибке и еще какое-нибудь значение левой переменной залезть в результат. |
||||
|
|||||
fantome |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 5.2.2007 Репутация: 1 Всего: 1 |
1one,
А если в отладчике ввалиться в функцию print и посмотреть, как она обработает эту строку? тоисть взять кусок из самой функции... ![]() |
|||
|
||||
1one |
|
||||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 26.6.2007 Репутация: 1 Всего: 1 |
Разве перловая функция написана на самом перле? Не думаю, что будет удачным преобразование с низкого уровня на уровень перла. |
||||
|
|||||
Nab |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
Ээээ нет, не нужно тут ставить новые задачи... Вы или сформулируйте вопрос однозначно или не морочьте голову, а то от первоначального вопроса мы уже ой как далеко ушли... Пример пожалуйста того, что может быть во входной строке, и то что должно в итоге получиться в выходной... -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
|||
|
||||
1one |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 26.6.2007 Репутация: 1 Всего: 1 |
да вопрос то все тот же, просто под разными углами формулирую. примеры: ------------ 1) на входе: ma\npa на выходе: ma pa ------------ 2) на входе: ma\\npa на выходе: ma\npa ------------ 3) на входе: ma\\\npa на выходе: ma\ pa ------------ 4) на входе: ma\\\\npa на выходе: ma\\npa ------------ |
|||
|
||||
nitr |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
Задача решаема не в одну строку, тут и "конечные автоматы" можно и многое другое - регеспы вам не в помощь! Можете сами посмотреть, вывод строки:
вывод одинаковый, а слешей больше ;) т.е.
так что пересмотрите задачу. Лучше, как советовал Nab - получить данные, которые можно обработать. |
||||
|
|||||
1one |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 26.6.2007 Репутация: 1 Всего: 1 |
На мой взгляд, решение существует именно в одну строку (на крайний случай - пара-тройка).
Всего то и нужно: идти _последовательно_ по строке (наверняка в регекспе будет фигурировать метасимвол \G) и заменять {\\ на \} и {\n на 0xA}. Причем операция замены {\\ на \} по приоритету выше, чем {\n на 0xA}. Вот и все. это и надо уместить в регексп(ы). |
|||
|
||||
nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
1one, вы прочли предыдущее предложение. Perl понимает '\n' так же как и '\\n'
![]() |
|||
|
||||
Nab |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
1one, вы издеваетесь? Я привел решение, Вы начинаете говорить о левых переменных которые могут попасть в строку, и тут же приводите примеры входных строк без таких нюансов...
Вы бы для себя определились что хотите, а потом начали задавать вопросы.... И ответьче ЧЕМ КОНКРЕТНО НЕ УСТРАИВАЕТ МОЙ ВАРИАНТ? Все ваши примеры он по определению решает на УРА! -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
|||
|
||||
1one |
|
||||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 26.6.2007 Репутация: 1 Всего: 1 |
Nab, ты предложил решение eval "\$str = \"$str\""; Оно подходит, да. Если бы не одно НО: строка $str вводится пользователем, который может (случайно) написать во введенной строке как имена служебных переменных (типа $_ $% $@ $! и пр.), так и имя переменной (например, $str), которая существует в коде, в котором выполняется eval'ом эта самая строка. Соответственно, при выполнении eval туда подставится значение указанной переменной. Экранирование $ на \$ перед исполнением eval у меня проблемы не решило:
|
||||
|
|||||
JAPH |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: 3 Всего: 23 |
Проверьте
Добавлено через 9 минут nitr,
Конечные автоматы.. А регекспы в перле как реализованы? По-моему, как раз НКА ![]() -------------------- Что непонятно - спрашиваем ![]() |
||||
|
|||||
1one |
|
||||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 26.6.2007 Репутация: 1 Всего: 1 |
JAPH, черт возьми, работает!!! =) Спасибо. Теперь вот разберусь че куда в етом регекспе. Почему модификатор e 2 раза и двойные qq... |
||||
|
|||||
nitr |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
ууууууууууууу
1one, вы сами себе противоречите!!!
вывод:
И все выши попытки - это подгон к результату. Если прочесть тему сначала, будет ясно почему... Добавлено через 3 минуты и 7 секунд JAPH, и вы внимательно прочтите...
РАЗНЫЕ ВЕЩИ! Я это специально привел как пример ;) гляньте на первые 3 поста, там 1one, как бы уточняет суть вопроса и приводит пример, достаточно точный. Добавлено через 4 минуты и 24 секунды точнее даже на этом ярче видно:
|
||||||||
|
|||||||||
1one |
|
||||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 26.6.2007 Репутация: 1 Всего: 1 |
Задачка решена. Nitr, Nab, вам тоже спасибо за обсуждение. ps: Nitr, я выразился неточно значит. В цитате "то же самое" надо, видимо, заменить на "почти то же самое". Я не знал, что perl пакостит с ('\n' eq '\\n'). В общем, всем thanks, specially thanks for JAPH. |
||||
|
|||||
JAPH |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: 3 Всего: 23 |
![]() Меня несколько смущает следующее:
Сравните выводы 1 и 2, а затем то, что с ними сделали 3 и 4. ![]() Добавлено @ 14:10 nitr, дык я тоже как пример.. А что касается первых трёх постов, так я и не встревал, так как не мог чётко сформулировать задачу... А так, в ходе многочисленных рассуждений прояснилось... ![]() 1one, perl не пакостит! просто в одинарных кавычках он заменяет только \\ и \', \n он не знает и оставляет как есть. ![]() Это сообщение отредактировал(а) JAPH - 27.6.2007, 14:19 -------------------- Что непонятно - спрашиваем ![]() |
|||
|
||||
1one |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 26.6.2007 Репутация: 1 Всего: 1 |
в общем, работает на основе того, что eval от, например, qq(qq(\\\\)) дает нужный результат. Причем qq начинают интерполироваться из внутренних скобок самые первые.. |
|||
|
||||
JAPH |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: 3 Всего: 23 |
В смысле? Внешние qq - оператор, внутренние - строка...
-------------------- Что непонятно - спрашиваем ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |