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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Одновременно поиск и замена 
:(
    Опции темы
s_a_s_h_a
Дата 16.3.2005, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вопрос. Можно ли сделать следующее и если да, то как это лучше сделать. В тексте встречаются последовательности символов:

.cgi?id=111
.cgi?id=121
.cgi?id=21

надо найти и сохранить в массиве числа, а эти последовательности заменить в тексте на

#pic_1#
#pic_2#
#pic_3#
PM MAIL   Вверх
chaos
Дата 16.3.2005, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


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

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



вот небольшой пример
Код

$str="blablabla.cgi?id=111";
if ($str =~ /(.+\.cgi\?id=)(\d+)/) {
  $mas[$counter++] = $2;
  $temp="#pic_${2}#";
  $str ~= s/(.+\.cgi\?id=)/$temp/;
}

Может не работать smile тк не проверял, перла нет

Это сообщение отредактировал(а) chaos - 16.3.2005, 14:17
PM WWW   Вверх
s_a_s_h_a
Дата 16.3.2005, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В тексте не одна последовательность вида .cgi?id=M (M - число), а несколько. И важно, что в #pic_N# N принимает значения 1, 2, 3, ...



PM MAIL   Вверх
korob2001
Дата 16.3.2005, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Только вот я не понял, где хранится текст???? Вот припмер с массивом строк, если нужно работать с файлами и не сможешь подправить сам, дай знать:
Код

#!/usr/bin/perl -w
use strict;
my $i = 0;
my @arr;
my @strs = qw( fdfddsfsddv.cgi?id=814fdfdfdfdfdf.cgi?id=102fdfdfdfdf.cgi?id=21
               fdfddsfsddv.cgi?id=190fdfdfdfdfdf.cgi?id=511fdfdfdfdf.cgi?id=47
               fdfddsfsddv.cgi?id=214fdfdfdfdfdf.cgi?id=707fdfdfdfdf.cgi?id=82
               fdfddsfsddv.cgi?id=234fdfdfdfdfdf.cgi?id=331fdfdfdfdf.cgi?id=11 );
# Вот так выглядит наш массив до обработки
print join("\n", @strs), "\n\n";
print "=" x 70, "\n\n";

# Обрабатываем массив
foreach my $str ( @strs ) {
     push( @arr, $1 ) while $str =~ s/\.cgi\?id=(\d+)/"#pic_" . $i++ . "#"/ei;
}

# Покажем массив после обработки
print join("\n", @strs), "\n";
print "-" x 70, "\n";
print "\@arr = " . join(", ", @arr), "\n";

print "\n\n";
print "=" x 70, "\n\n";

# А вот обратное преобразование
foreach my $str ( @strs ) {
     $str =~ s/\#pic_(\d+)\#/.cgi?id=$arr[$1]/ig;
}
# Покажем массив после обратной обработки
print join("\n", @strs), "\n";

Здесь показана замена как в одну сторону, так и в другую. ;)))))

Удачи.

Это сообщение отредактировал(а) korob2001 - 16.3.2005, 20:59


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Kiber_rat
Дата 16.3.2005, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MACMANIAC
**


Профиль
Группа: Участник
Сообщений: 276
Регистрация: 18.4.2002
Где: Ashdod, Israel

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



Если я правильно понял задачу, то надо все числа после cgi?id= сохранить в массив, а сами .cgi?id=М заменить на #pic_[array index]#?
Если вопрос в этом то можно сделать так:
Код

#!/usr/bin/perl -w
use strict;
my $i=1;
my @arr;
my $txt= <<EOF;
Some text here cgi?id=111 some text here cgi?id=112
Some text here cgi?id=121 some text here cgi?id=122
Some text here cgi?id=21 some text here cgi?id=211
EOF
$arr[$i++-1]=$1  while $txt=~s!cgi\?id=(\d+)!#pic_$i#!i;
print $txt;
print "$_\n" for @arr;


Это сообщение отредактировал(а) Kiber_rat - 16.3.2005, 21:33


--------------------
Best regards!                                                             
@..@_____Ku6ep
=*=______\______KPbIC
Код
print join "",map{chr}(split/(\w{2})/,hex(int(2175.57302796298**2)))
PM WWW ICQ Skype Jabber YIM   Вверх
korob2001
Дата 16.3.2005, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Kiber_rat - со стёком Perl работает быстрее, чем с индексами.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Kiber_rat
Дата 16.3.2005, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MACMANIAC
**


Профиль
Группа: Участник
Сообщений: 276
Регистрация: 18.4.2002
Где: Ashdod, Israel

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



Ок smile Если это критичное по скорости приложение тогда так:
Код

push @arr, $1  while $txt=~s!cgi\?id=(\d+)!#pic_$i++#!i;


Это сообщение отредактировал(а) Kiber_rat - 17.3.2005, 14:16


--------------------
Best regards!                                                             
@..@_____Ku6ep
=*=______\______KPbIC
Код
print join "",map{chr}(split/(\w{2})/,hex(int(2175.57302796298**2)))
PM WWW ICQ Skype Jabber YIM   Вверх
korob2001
Дата 17.3.2005, 06:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Kiber_rat - какую роль играет переменная $i?????
Код

push @arr, $1  while $txt=~s!cgi\?id=(\d+)!#pic_$i#!i;




--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
s_a_s_h_a
Дата 17.3.2005, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


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

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


 




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


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

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