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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> интерполяция метасимволов, как синтезировать операцию интерполяции 
:(
    Опции темы
1one
Дата 26.6.2007, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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;
PM MAIL   Вверх
Nab
Дата 26.6.2007, 15:57 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Так что именно должно получиться то?

Приведите пример выходной строки.


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
nitr
Дата 26.6.2007, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



вариантов много - один из них:
Код

$str =~ s/[\\]+n/\n/g;



--------------------
PM   Вверх
1one
Дата 26.6.2007, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Nab @ 26.6.2007,  15:57)
Приведите пример выходной строки.

например,
есть строка 'one\ntwo\\nthree\\\nfour\\\\nfive'

на выходе будет:

one
two\nthree\
four\\nfive

т.е. то же самое, если бы вы вывели print "one\ntwo\\nthree\\\nfour\\\\nfive";
PM MAIL   Вверх
nitr
Дата 26.6.2007, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



а если бэкслеш как символ, то так:
Код

$str =~ s/\\n/\n/g;


З.Ы.: ответьте на вопрос Nab - для уточнения

Добавлено через 1 минуту и 14 секунд
вооо - теперь понято стало =)


--------------------
PM   Вверх
Nab
Дата 26.6.2007, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(nitr @ 26.6.2007,  16:01)
вариантов много - один из них:
Код

$str =~ s/[\\]+n/\n/g;

nitr, ты чего?
самый простой способ, это:
Код

$str = "$str";
print $str;


 smile 


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
nitr
Дата 26.6.2007, 16:08 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



Nab, уверен? smile)



--------------------
PM   Вверх
1one
Дата 26.6.2007, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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";
PM MAIL   Вверх
Nab
Дата 26.6.2007, 16:37 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(nitr @  26.6.2007,  16:08 Найти цитируемый пост)
Nab, уверен? smile)

неееее, стыдно... :(
потому проверил, и могу сказать что задача не решаема в принципе smile
потому как интерпретация обратного слеша происходит и в одиночных кавычках...

то есть 
Код

$f = "\\n";
$g = '\\n';

print $f, $g;


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

$str = 'one\ntwo\\nthree`, что она будет иметь вид
Код

one\ntwo\nthree

 дельнейшая обработка безсмысленна, потому как утеряна важная информация, и при интерполяции каким либо способом и первая \n и вторая дадут одинаковое вхождение... Здесь нужна предварительная обработка входных данных, тех которые ниразу не прошли интерпретацию процессором перла...



--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
1one
Дата 26.6.2007, 16:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



2 Nab:

> Здесь нужна предварительная обработка входных данных, тех которые ниразу не прошли интерпретацию процессором перла...

Данные препроцессором перла не проверяются изначально.

Я выразился "так, как при выводе метасимволов в STDOUT в двойных кавычках" всего-лишь для того, чтобы было понятнее.

перефразирую мою задачку так:

Метасимволами являются '\' и '\n'.
В свою эчередь, их можно экранировать (чтобы они не обрабатывались как спец. символы), поставив перед ними еще один слеш.
Как сделать так, чтобы двойные слеши менялись на одинарные, а \n - на символ перевода строки. Причем замены эти, я так понял, должны идти только строго последовательно, тогда и получится "так, как в выводе в двойн. каычках в STDOUT"

Т.е.
есть у нас \\\\\\n
получим \\\n (двойные слеши заменились одинарными, а для n, в свою очередь, не осталось слеша впереди (т.к. поиск на предмет замен идет попарно по 2 символа), поэтому преобразование в символ перевода строки произведено не было).

-----
Вот и не соображу, как это регекспом выразить...
PM MAIL   Вверх
Nab
Дата 26.6.2007, 17:23 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



а зачем?

Проще эту работу поручить перлу...
Код

eval "\$str = \"$str\"";





--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
dimes
Дата 26.6.2007, 19:09 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Nab
Главное что бы в тексте не встречалась спецуха типа '$' smile

По-моему первый вариант предложенный nitr, "$str =~ s/[\\]+n/\n/g;"
вполне жизнеспособный и быстрый. Или я что то не понимаю?

PM ICQ   Вверх
Nab
Дата 26.6.2007, 20:02 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(dimes @  26.6.2007,  19:09 Найти цитируемый пост)
Главное что бы в тексте не встречалась спецуха типа '$' smile

ну эт уже проблемы другого плана smile

Цитата(dimes @  26.6.2007,  19:09 Найти цитируемый пост)
По-моему первый вариант предложенный nitr, "$str =~ s/[\\]+n/\n/g;"

не совсем, где сказано что в конце по любому 'n' ? и потом ему нужно пару '\\' превратить в одну, а не убить их всех одним махом smile

Я так понял требуеться для общего случая, когда и такое может случиться: 'aaa\\\n\\\\bb'...



--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
1one
  Дата 27.6.2007, 08:14 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Nab @ 26.6.2007,  20:02)
не совсем, где сказано что в конце по любому 'n' ? и потом ему нужно пару '\\' превратить в одну, а не убить их всех одним махом smile

Я так понял требуеться для общего случая, когда и такое может случиться: 'aaa\\\n\\\\bb'...

вот-вот...

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


Новичок



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

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



Цитата(Nab @ 26.6.2007,  17:23)
а зачем?

Проще эту работу поручить перлу...
Код

eval "\$str = \"$str\"";

Это был бы действительно вариант, если бы не интерпретация и других спецсимволов в том числе - 
а то, да, может по ошибке и еще какое-нибудь значение левой переменной залезть в результат.
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.0783 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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