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

Поиск:

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


Шустрый
*


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

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



1one
Цитата

т.е. то же самое, если бы вы вывели print "one\ntwo\\nthree\\\nfour\\\\nfive";


А если в отладчике ввалиться в функцию print и посмотреть, как она обработает эту строку?
тоисть взять кусок из самой функции...  smile 
PM MAIL   Вверх
1one
Дата 27.6.2007, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(fantome @ 27.6.2007,  08:48)
1one
Цитата

т.е. то же самое, если бы вы вывели print "one\ntwo\\nthree\\\nfour\\\\nfive";


А если в отладчике ввалиться в функцию print и посмотреть, как она обработает эту строку?
тоисть взять кусок из самой функции...  smile

Разве перловая функция написана на самом перле?
Не думаю, что будет удачным преобразование с низкого уровня на уровень перла.
PM MAIL   Вверх
Nab
Дата 27.6.2007, 09:37 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(1one @  27.6.2007,  08:44 Найти цитируемый пост)
Это был бы действительно вариант, если бы не интерпретация и других спецсимволов в том числе - а то, да, может по ошибке и еще какое-нибудь значение левой переменной залезть в результат.

Ээээ нет, не нужно тут ставить новые задачи... Вы или сформулируйте вопрос однозначно или не морочьте голову, а то от первоначального вопроса мы уже ой как далеко ушли... 

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


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


Новичок



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

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



Цитата(Nab @ 27.6.2007,  09:37)
Пример пожалуйста того, что может быть во входной строке, и то что должно в итоге получиться в выходной...

да вопрос то все тот же, просто под разными углами формулирую.

примеры:
------------
1)
на входе:
ma\npa
на выходе:
ma
pa
------------
2)
на входе:
ma\\npa
на выходе:
ma\npa
------------
3)
на входе:
ma\\\npa
на выходе:
ma\
pa
------------
4)
на входе:
ma\\\\npa
на выходе:
ma\\npa
------------
PM MAIL   Вверх
nitr
Дата 27.6.2007, 10:21 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Задача решаема не в одну строку, тут и "конечные автоматы" можно и многое другое - регеспы вам не в помощь! Можете сами посмотреть, вывод строки:
Код

print 'one\ntwo\\nthree';

вывод одинаковый, а слешей больше ;)
т.е.
Цитата

one\ntwo\nthree

так что пересмотрите задачу. Лучше, как советовал Nab - получить данные, которые можно обработать.


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


Новичок



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

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



На мой взгляд, решение существует именно в одну строку (на крайний случай - пара-тройка).

Всего то и нужно:
идти _последовательно_ по строке (наверняка в регекспе будет фигурировать метасимвол \G) и заменять {\\ на \} и {\n на 0xA}.

Причем операция замены {\\ на \} по приоритету выше, чем {\n на 0xA}. Вот и все. это и надо уместить в регексп(ы).
PM MAIL   Вверх
nitr
Дата 27.6.2007, 11:12 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



1one, вы прочли предыдущее предложение. Perl понимает '\n' так же как и '\\n'
Код

print 'ok' if '\n' eq '\\n';

smile так что... совет - прислушаться к совету.


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


Опытный
**


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

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



1one, вы издеваетесь? Я привел решение, Вы начинаете говорить о левых переменных которые могут попасть в строку, и тут же приводите примеры входных строк без таких нюансов...

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

И ответьче ЧЕМ КОНКРЕТНО НЕ УСТРАИВАЕТ МОЙ ВАРИАНТ?

Все ваши примеры он по определению решает на УРА!


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


Новичок



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

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



Цитата(Nab @ 27.6.2007,  12:08)
1one, вы издеваетесь? Я привел решение, Вы начинаете говорить о левых переменных которые могут попасть в строку, и тут же приводите примеры входных строк без таких нюансов...

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

И ответьче ЧЕМ КОНКРЕТНО НЕ УСТРАИВАЕТ МОЙ ВАРИАНТ?

Все ваши примеры он по определению решает на УРА!

Nab, ты предложил решение
eval "\$str = \"$str\"";

Оно подходит, да. Если бы не одно НО:
строка $str вводится пользователем, который может (случайно) написать во введенной строке как имена служебных переменных (типа $_ $% $@ $! и пр.), так и имя переменной (например, $str), которая существует в коде, в котором выполняется eval'ом эта самая строка. Соответственно, при выполнении eval туда подставится значение указанной переменной.
Экранирование $ на \$ перед исполнением eval у меня проблемы не решило:

Код

# EVAL variant
my $bug = "ZLOI BUG!";
my $str = 'ma\\\\\npa $%$_$! $bug';
$str =~ s/\$/\\\$/; # попробуем защитить от подстановки значения
eval "\$str = \"$str\"";

print "----------\n";
print STDERR $str;
print "\n----------\n";

PM MAIL   Вверх
JAPH
Дата 27.6.2007, 12:43 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Проверьте 
Код
s/(\\[\\n])/qq{qq{$1}}/gee


Добавлено через 9 минут
nitr
Код

print "ok" if "\n" eq "\\n";


Конечные автоматы.. А регекспы в перле как реализованы? По-моему, как раз НКА smile


--------------------
Что непонятно - спрашиваем smile
PM MAIL ICQ   Вверх
1one
Дата 27.6.2007, 12:57 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(JAPH @ 27.6.2007,  12:43)
Проверьте 
Код
s/(\\[\\n])/qq{qq{$1}}/gee

JAPH, черт возьми, работает!!! =)
Спасибо.

Теперь вот разберусь че куда в етом регекспе. Почему модификатор e 2 раза и двойные qq...
PM MAIL   Вверх
nitr
Дата 27.6.2007, 13:35 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



ууууууууууууу

1one, вы сами себе противоречите!!!
Код

#!perl
use strict;
use warnings;

print "------ Original:\n";
print "one\ntwo\\nthree\\\nfour\\\\nfive";

my $str = 'one\ntwo\\nthree\\\nfour\\\\nfive';
$str =~ s/(\\[\\n])/qq{qq{$1}}/gee;

print "\n------ Code:\n";
print $str;

вывод:
Цитата

------ Original:
one
two\nthree\
four\\nfive
------ Code:
one
two
three\nfour\nfive

И все выши попытки - это подгон к результату. Если прочесть тему сначала, будет ясно почему...

Добавлено через 3 минуты и 7 секунд
JAPH, и вы внимательно прочтите...
Код

print "ok" if "\n" eq "\\n";
print "ok" if '\n' eq '\\n';

РАЗНЫЕ ВЕЩИ! Я это специально привел как пример ;)

гляньте на первые 3 поста, там 1one, как бы уточняет суть вопроса и приводит пример, достаточно точный.

Добавлено через 4 минуты и 24 секунды
точнее даже на этом ярче видно:
Код

print "ok1" if "\n" eq "\\n";
print "ok2" if '\n' eq '\\n';



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


Новичок



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

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



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

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

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

one
two\nthree\
four\\nfive

т.е. то же самое, если бы вы вывели print "one\ntwo\\nthree\\\nfour\\\\nfive";

Задачка решена.
Nitr, Nab, вам тоже спасибо за обсуждение.

ps: Nitr, я выразился неточно значит. В цитате "то же самое" надо, видимо, заменить на "почти то же самое". Я не знал, что perl пакостит с ('\n' eq '\\n').

В общем, всем thanks, specially thanks for JAPH.
PM MAIL   Вверх
JAPH
Дата 27.6.2007, 14:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



smile гы...
Меня несколько смущает следующее:
Код
my $s = 'asd\\\\nasd\\nasd';
$_ = $s; print "<$_>\n";
$_ = $s; s/(\\[\\n])/$1/g; print "<$_>\n";
print "\n";
$_ = $s; s/(\\[\\n])/qq{$1}/g; print "<$_>\n"; # 1
$_ = $s; s/(\\[\\n])/qq{$1}/ge; print "<$_>\n"; # 3
print "\n";
$_ = $s; s/(\\[\\n])/qq{qq{$1}}/g; print "<$_>\n";
$_ = $s; s/(\\[\\n])/qq{qq{$1}}/ge; print "<$_>\n"; # 2
$_ = $s; s/(\\[\\n])/qq{qq{$1}}/gee; print "<$_>\n"; # 4

Сравните выводы 1 и 2, а затем то, что с ними сделали 3 и 4. smile

Добавлено @ 14:10
nitr, дык я тоже как пример.. А что касается первых трёх постов, так я и не встревал, так как не мог чётко сформулировать задачу... А так, в ходе многочисленных рассуждений прояснилось... smile
1one, perl не пакостит! просто в одинарных кавычках он заменяет только \\ и \', \n он не знает и оставляет как есть. smile

Это сообщение отредактировал(а) JAPH - 27.6.2007, 14:19


--------------------
Что непонятно - спрашиваем smile
PM MAIL ICQ   Вверх
1one
Дата 27.6.2007, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(JAPH @ 27.6.2007,  14:06)
Сравните выводы 1 и 2, а затем то, что с ними сделали 3 и 4. smile

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


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

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