Forum Webscript.Ru
Программирование => Perl => Тема начата: DamonLSD от 02 Февраля 2006, 17:27:34
-
Здравствуйте!
Имеется файл, который я открываю, нахожу и "вырезаю" нужные строки и сохраняю эти строки в новом файле.
Подскажите, а как сохранить в новом файле не все найденные строки, а только скажем, первые пять?!
Спасибо.
-
вырезайте в массив первые 5 строк. или в хеш.
что-либо в роде for(1..5) { пишем в новый файл }
покажите эту часть кода:DamonLSD:
"вырезаю" нужные строки и сохраняю эти строки в новом файле
-
open(FILE,"$file") || print "Файл не найден!\\n";
@str=;
close FILE;
open(FILE,">$file");
for($i=0;$i<=$#{@str};$i++)
{
## если попадаются строки, содержащие " blabla XXX "
## то я их "вырезаю" из $file и сохраняю в файле tmp.txt
if($str[$i]=~ / blabla XXX /) {
open (F813, ">>tmp.txt") || die print "Cannot open file: $!";
print F813 "$str[$i]";
close (F813);
$str[$i]="";
}
print FILE "$str[$i]";
}
close FILE;
close FILE;
-
самый простейший вариант, на основе вашего кода:
#!/usr/bin/perl -w
use strict;
my ($file,$destination,$k,@lines) = (\'../data/source.txt\',\'../data/destination.txt\',1,\'\');
print "\\n\\n";
open(FILE,"$file") || print "Файл не найден!\\n";
seek(FILE,0,0); my @str=; close FILE;
open(FILE,">$file");
for(my $i=0;$i<=$#str;$i++) {
if($str[$i]=~ /blabla XXX/) { if ($k<=5) {push @lines,$str[$i]; $k++} $str[$i]=""; }
print FILE $str[$i];
}
close FILE;
if(@lines) {
open (F813, ">>$destination") || die print "Cannot open file: $!";
print F813 @lines;
close (F813);
}
но вообще это не лучший вариант: смею надеяться, что у вас $file небольшого объёма и позволяет использовать @str=;
:)
-
Спасибо! ... сейчас попробую
-
AnnA, спасибо тебе за подсказку ;) ... у меня заклинило, что надо через цикл делать, вот и не получалось.
Изменил свой код, смотри что получилось:
$cnt = 0;
open(FILE,"$file") || print "Файл не найден!\\n";
@str=;
close FILE;
open(FILE,">$file");
for($i=0;$i<=$#{@str};$i++)
{
## если попадаются строки, содержащие " blabla XXX "
## то я их "вырезаю" из $file и сохраняю в файле tmp.txt
if($str[$i]=~ / blabla XXX /) {
if ($cnt<=5) {
open (F813, ">>tmp.txt") || die print "Cannot open file: $!";
print F813 "$str[$i]";
close (F813);
$str[$i]="";
}
$cnt++;
}
print FILE "$str[$i]";
}
close FILE;
close FILE;
... все работает!
спасибо :)
-
на мой взгляд, когда "работает", важно еще и как работает.
зачем вы открываете/закрываете файл в режим дописывания 5 раз, когда это можно сделать 1 раз? :)
и в вашем варианте после 5-го раза найденный текст не обнуляется в исходном файле. так и нужно было?DamonLSD:
close FILE; close FILE;
а это зачем? :)