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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Трабл с s///, Не происходит замена текста 
V
    Опции темы
KSURi
Дата 17.3.2007, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Есть код, который модифицирует другой код, в частности заменяет имена переменных на случайно сгенерированные строки:
Код

my(%seen,@vars);
my @tmp=$source=~/[my|local|our]\s+([\$|\@|\%]\w+)/mg;
foreach(@tmp)
{
    # Фильтруем основные спец. переменные и повторы
    next if /[EXPORT|VERSION|ISA|ARGV|SIG|ENV|0-9|_]/;
    push(@vars,$_) if !exists $seen{$_}; $seen{$_}=1;
}
foreach(@vars)
{
    # Узнаем тип переменной и ее оригинальное имя
    my($new,$context);
    if(substr($_,0,1) eq '@')      { $context='@' }
    elsif(substr($_,0,1) eq '%') { $context='%' }
    else { $context='$' }
    # Генерируем новое имя на основе длины старой
    # _trashName() - саб для генерации случайных строк
    $new=$context._trashName($_);
    # Меняем все вхождения оригианльного имени
    $source=~s/$_/$new/g;
}


В переменной $source содержится модифицируемый исходник, считанный вот таким макаром:
Код

open(IN,$target)||die $!;
my $source;
{ local $/=undef; $source=<IN>; }


В дебаггере видно что имена переменных нормально помещаются в @tmp, значит переменные нормально отлавливаются. Однако замены все равно не происходит (с флагом m в s/// тоже)...
Код


#!perl -w

use strict;

my $name=<STDIN>;
print "Your name is: ".$name;
`pause`;


Этот код остается без изменений. Иногда, в более больших сорцах замена 2-3 переменных из 10-15 все-таки происходит.
В чем трабл?

Это сообщение отредактировал(а) KSURi - 17.3.2007, 20:10


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
nitr
Дата 17.3.2007, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

foreach my $var (@vars) {
...
}

работаем с $var smile , может в том и были "грабли"...


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


Опытный
**


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

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



Ну я думаю последнюю строчку можно заменить вот так, а то боюсь он ее еще раз интерпретирует:
Код

   $source=~s/\Q$_\E/$new/g;

хотя может лучше вот так:
Код

    $new='\'.$context._trashName($_);


А вообще код не очень внятный...
Код

my(%seen,@vars);
my @tmp=$source=~/[my|local|our]\s+([$@%]\w+)/mg;
foreach(@tmp)
{
    # Фильтруем основные спец. переменные и повторы
    next if /[EXPORT|VERSION|ISA|ARGV|SIG|ENV|0-9|_]/;
    $seen{$_}++
}

foreach( keys %seen )
{
    # Узнаем тип переменной и ее оригинальное имя
    my($new,$context);
    # next если к примеру GLOB указан...
    next unless /^([$@%])/;
    $context = $1;
    # Генерируем новое имя на основе длины старой
    # _trashName() - саб для генерации случайных строк
    $new='\'.$context._trashName($_);
    # Меняем все вхождения оригианльного имени
    $source=~s/$_/$new/g;
}



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


Опытный
**


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

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



Nab
tnx, помогл обрамление в \Q...\E

ЗЫ: вариант с добавление слэша вообще оказался не рабочим

Это сообщение отредактировал(а) KSURi - 17.3.2007, 23:24


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
nitr
Дата 18.3.2007, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



KSURi, это необрамление, а экранирование символов...


--------------------
PM   Вверх
KSURi
Дата 18.3.2007, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(nitr @  18.3.2007,  00:21 Найти цитируемый пост)
KSURi, это необрамление, а экранирование символов... 

Ну немного не так выразился)


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
stan777
Дата 19.3.2007, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Мда кто ж мог знать что в редактируемом скриптом перл-файле могут быть метасимволы smile.

Код

........
    $seen{$_}++
}

foreach( keys %seen )
{
  ..........
}

Да так красивше smile и быстрей наверное

Это сообщение отредактировал(а) stan777 - 19.3.2007, 00:22
PM MAIL   Вверх
amg
Дата 19.3.2007, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

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



Цитата(KSURi @  17.3.2007,  20:09 Найти цитируемый пост)
my @tmp=$source=~/[my|local|our]\s+([\$|\@|\%]\w+)/mg;
...
next if /[EXPORT|VERSION|ISA|ARGV|SIG|ENV|0-9|_]/;

Вот в этих строках, в квадратных скобках... Подозреваю, это не совсем то, что имелось в виду. Может, нужно так:
Код

my @tmp=$source=~/(?:my|local|our)\s+([$@%]\w+)/mg;
...
next if /EXPORT|VERSION|ISA|ARGV|SIG|ENV|\d|_/;

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


Опытный
**


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

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



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


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


Создатель
***


Профиль
Группа: Завсегдатай
Сообщений: 1262
Регистрация: 14.2.2006
Где: Москва

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



Нет особой возможности сделать это универсально.
Можно, ведь, составлять имена динамически, а ещё есть eval.

Вобщем, абсфукация получается для ограниченного количества вариантов.
PM MAIL ICQ Skype   Вверх
tishaishii
Дата 20.3.2007, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


Профиль
Группа: Завсегдатай
Сообщений: 1262
Регистрация: 14.2.2006
Где: Москва

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



Короче, не знаю что и предложить, примерный вариант для абсфукатора:
Код
use Digest::SHA1 qw(sha1_hex);
my$source=join undef, <DATA>;
$source=~s{([\$\@\%])\{?([^(?:EXPORT|VERSION|ISA|ARGV|SIG|ENV|0-9|_|\W)]+?)\}?}{$1${\&sha1_hex(+$1.'{'.$2.'}')}}gos;
print $source;

__END__
my(%seen,@vars);
my @tmp=$source=~/[my|local|our]\s+([\$|\@|\%]\w+)/mg;
foreach(@tmp)
{
    # Фильтруем основные спец. переменные и повторы
    next if /[EXPORT|VERSION|ISA|ARGV|SIG|ENV|0-9|_]/;
    push(@vars,$_) unless exists $seen{$_}; $seen{$_}=1;
}

Но он не спасает в универсале.

Это сообщение отредактировал(а) tishaishii - 20.3.2007, 17:55
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0557 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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