Xpoint
   [напомнить пароль]

Если в файле больше 10 строк удаляем первую

Метки: [без меток]
[удл]
2007-08-15 13:38:10 [обр] Andrej[досье]
Давно уже не писал на Perl, много забыл. Помогите пожалуйста написать маленькиц скрпт который будет проверять строки файла. И если в нем больше 10 строк он будет удалять первые строчки файла пока их не станет 10.
спустя 1 час 1 минуту [обр] Алексей Севрюков(198/1280)[досье]

Andrej[досье]

open(F,"<",'file.txt');
my @arr=<F>;
close(F);

@arr=@arr[$#arr-10..$#arr] if @arr>10;

open(F,">",'file.txt');
print F join('',@arr);
close(F);

P.S. Набросал на скорую руку, не проверял.

спустя 7 минут [обр] Andrej[досье]
Спасибо, работает.
спустя 5 минут [обр] Алексей Севрюков(198/1280)[досье]
Andrej[досье] да, только посчитайте количество строк, кажется их 11 получается )
спустя 34 минуты [обр] Lynn «Кофеман»(3/571)[досье]

Особенно забавно будет подсунуть этому скрипту двухгиговый лог :)

P.S. А чем tail не устраивает?

спустя 10 минут [обр] Алексей Севрюков(198/1280)[досье]
Lynn «Кофеман»[досье] Мы в основах ) На 2 гига я не расчитывал естественно.
спустя 1 час 7 минут [обр] Дмитрий Кучкин(36/236)[досье]

print F join('',@arr);
join - это лишнее. Достаточно print F @arr;

Вариант, работающий и на больших файлах:

my @arr;
open (F,'file.txt');
while (<F>) {
  push @arr,$_;
  shift @arr if @arr>10;
}
close F;

open(F,'>','file.txt');
print F @arr;
close(F);
спустя 10 минут [обр] Алексей Севрюков(198/1280)[досье]

Дмитрий Кучкин[досье]

print F join('',@arr);
join - это лишнее. Достаточно print F @arr;

Кому как, мне не лишнее (чтобы гарантировать реальный правильный вывод в любом окружении). Впрочем посмотрите сами:

#!/usr/bin/perl
use strict;


my @arr=qw(1 2 3);

open(F,">","file.txt");

print F "Default:\n";
print F @arr;
print F "\n\n";

$,=",";
print F "Delimiter ,:\n";
print F @arr;

close(F);

$, глобальная, и если неправильно пользоваться то можно получить кучу непонятных ошибок. А ведь есть наверно люди, которые таки используют неправильно, согласитесь?

спустя 2 минуты [обр] Алексей Севрюков(198/1280)[досье]
Да, есть еще и другие такие интересные переменные, например, $\ тоже влияет на вывод списков.
спустя 5 часов [обр] Дмитрий Кучкин(36/236)[досье]

Пользуюсь спец-переменными довольно часто, но всегда через { local .... }, поэтому обычно полагаю, что глобально они, все-таки, имеют значения по умолчанию. А если полагать иначе, тогда надо и при вводе не забыть про $/ ;)

И, кстати, $\ влияет на вывод любых данных, не только списков. Ее значение печатается в самом конце, за последним аргументом оператора print.

Powered by POEM™ Engine Copyright © 2002-2005