|
Модераторы: ginnie |
|
kirillekb |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 14.7.2014 Репутация: нет Всего: нет |
Здравствуйте уважаемые форумчане!
В Perl я новичок и думаю, что моя задача решается в два действия. Есть файл temp.txt в котором необходимо заменить слово wall на wall1. Попробовал самостоятельно написать скрипт, но что то замены не происходит Заранее благодарен за любую помощь! Код: $file = "temp.txt"; open (INPUT, $file) || die "$!"; while ($line = <INPUT>) { if ($line =~ s/wall/wall1/g) { print INPUT $line } } close (INPUT); |
|||
|
||||
Bulat |
|
|||
татарский Нео Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: нет Всего: 57 |
А что-нибудь вообще выдает, может сообщения об ошибках??
Лично я сделал бы - считывал с одного файла, а записывал в другой, потом подменял файлы -------------------- менеджер по кодеврайтингу |
|||
|
||||
kirillekb |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 14.7.2014 Репутация: нет Всего: нет |
Спасибо большое за ответ!
Никаких ошибок не выдает. Попробовал считывание с одного файла и запись в другой, все получается. Мне вообще в конечном итоге необходимо, чтобы исходный файл "temp_prof1.csv" копировался 122 раза и в каждом файле подменялось имя с wall1, как в исходном файле на wall2..wall122. Пока что получается скопировать один файл и заменить в нем имя с wall1 на wall2. Наверное цикл надо писать? Если надо, то как это лучше сделать? Вот новый код $input = "temp_prof1.csv"; open (INPUT, $input) || die "$!"; $output = "temp_prof2.csv"; open (OUTPUT, ">>$output") || die "$!"; while ($line = <INPUT>) { $line =~ s/wall1/wall2/; print OUTPUT $line; } close (INPUT); close (OUTPUT); |
|||
|
||||
Bulat |
|
|||
татарский Нео Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: нет Всего: 57 |
лучше так - чтобы работало погугли на тему циклы в перл, там все относительно просто. Если будут какие-то конкретные вопросы - пиши. -------------------- менеджер по кодеврайтингу |
|||
|
||||
kirillekb |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 14.7.2014 Репутация: нет Всего: нет |
Разобрался
Код $input = "temp_prof1.csv"; for ($i=2; $i <= 122; $i++) { open (INPUT, $input) || die "$!"; $output = "temp_prof$i.csv"; open (OUTPUT, ">$output") || die "$!"; while ($line = <INPUT>) { $line =~ s/wall1/wall$i/; print OUTPUT "$line"; } close OUTPUT; close INPUT; } |
|||
|
||||
MasterOfRegex |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 25.10.2010 Репутация: нет Всего: нет |
Даю свой скриптик для обработки всех файлов в данном каталоге. В данном примере он расставляет номера перед строками. Можете переделать под свои нужды (для замены чего-то, отредактировав оператор s///):
#!/usr/bin/perl -w use strict; use bytes; use locale; # Обработка всех файлов в данном каталоге, чьи имена соотв. $namere. my $namere=qr/^filename.txt$/; my $fcount=0; my $substnum=0; undef $/; opendir DIR,'.'; foreach (readdir DIR) { &process_file($_) if $_ ne '.' && $_ ne '..' && -f $_ && $_ =~ $namere; } closedir DIR; print "$fcount files processed,\n$substnum substitutions made.\n"; sub process_file($) { print "$_: "; open F,"+<$_" or die "Can not open $_\n"; binmode F; $_=<F>; my $flen=length $_; seek F,0,0; # Здесь операторы замены в $_ # $substnum+=s///g; # Расставить номера строк my $i=1; $substnum+=s/^/$i++.'. '/mge; print F $_; die "Can not truncate!\n" if $flen > length $_ and !truncate(F,length($_)); close F; $fcount++; print "OK\n"; } Кстати, я автор книжки "Perl для профессиональных программистов. Регулярные выражения", есть ещё авторские экземпляры. А на стр. http://www.cronc.com/ru/ есть мои статейки по Perl re, в частности, как сконструировать пример re для проверки правильности арифметич. выражения с неограниченной вложенностью скобок. Аналогично можно конструировать re для всего, что подчиняется грамматике LL(1). |
|||
|
||||
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Регулярные выражения | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |