Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Поиск и изменеие строки в файле.


Автор: RedOk 7.4.2008, 03:07
Допустим дан файл следующего содержания:
Код

#1
#2
#3
#4
#5
#6

Как найти к примеру 5 и удалить перед ней #    .?
Заранее спасибо.

Автор: konstant1n 7.4.2008, 08:40
смотри в http://faq.perl.org/perlfaq5.html#How_do_I_change_dele 

Автор: GoDleSS 7.4.2008, 10:20
Постараюсь попроще сделать )
Код

my $find_match = '#5$';
my $to_delete = '#';
open(IF, $input);
open(OF, ">$output");
  while (<IF>) {
    chomp;
    if (m/$find_match/o) {
      s/$to_delete//o;
    }
    print OF "$_\n";
  }
close(OF);
close(IF);


Автор: RedOk 7.4.2008, 11:22
GoDleSS спаибо.

Автор: tolkien 7.4.2008, 17:13
Можно все в один шаблон засунуть и поиск и замену

s/#5//;

Автор: GoDleSS 7.4.2008, 17:49
Цитата(толкиен @  7.4.2008,  15:13, пост1470629)
Можно все в один шаблон засунуть и поиск и замену s/#5//;

Действительно, можно и так, но есть разница.
Если в файле будет очень много строк и редко встречается нужная, то оригинальный код будет работать быстрее по 2 причинам:
1. Поиск осуществляется быстрее, чем замена.
2. Флаг /о говорит о том, что данный шаблон компилируется один раз(имеет смысл лишь в случае применения предшаблонов, т.е. шаблонов, заранее загнанных в переменные.

В случае же вот такого коротенького файла 
Код

s/#(5)/$1/;

отработает скорее всего быстрее или с той же скоростью, при меньшем объеме кода.

Автор: tolkien 7.4.2008, 18:24
А ты не прав. Работать будет отлично и при очень и очень большом файле даже при гиганском файле.

Знаешь почему? 

Потому что поиск ведется не по всему файлу. А по короткой строке. 

Автор: nitr 7.4.2008, 21:44
tolkien, а что с памятью будет?

Автор: tolkien 7.4.2008, 21:58
У тебя строки мегабайтные что ли?

Автор: nitr 8.4.2008, 00:20
То что у меня при мне.
Цитата(tolkien @  7.4.2008,  18:24 Найти цитируемый пост)
Работать будет отлично и при очень и очень большом файле даже при гиганском файле.

Уважаемый, это ваше высказывание. Вот теперь постарайтесь это обосновать, уже нираз приводили коды/примеры/т.п. для ускорения/упрощения/"менеересурсопожираемости", а вы взяли всё это "обос***и" в одном ответе.

Автор: PanamOS 8.4.2008, 06:49
nitr, но первый пример тоже не застрахован от чрезмерных расходов памяти при больших строках;)
Но Вы безусловно правы по поводу

Цитата(nitr @  8.4.2008,  00:20 Найти цитируемый пост)
"обос***и" в одном ответе

Автор: nitr 8.4.2008, 23:28
PanamOS, не спорю, но предложенный с массивом - через чур smile (я про вариант "предложенный" тут) . Можно конечно подумать в сторону некоторых модулей, но зачем, редко возникают такие ситуации, когда "всё в одном".

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)