Всем привет!
Помогите, пожалуйста, кто сможет и кому не лень:
начал изучать перл по книге, но примеры там неинтересные, хочется к своим насущным надобностям и интересам новые знания применить. К слову, я держу у себя сервер "World Of Padman" - это игруля такая, построенная на модифицированном движке Quake III. Решил я попробовать разобрать лог-файл этого сервера, чтобы самому поковырять статистику и т. д.: Решил для начала разделить большой лог на части, чтобы лог каждого раунда игры был в отдельном файле. Каждый раунд начинается со строки:
0:00 ------------------------------------------------------------
Написал скрипт, который ищет такие строки и все, что между ними сохраняет в отдельные файлы, однако столкнулся с такой проблемой: почему-то регулярки, которые находят эту строку, находят не каждую из таких строк, а как-то через одну, или более. Никак не могу это побороть! Может найдется какой опытный перловщик, который сможет мне растолмачить, что-же я делаю не так?
Мой
говноскрипт, пример исходного лога и те логи, которые у меня получаются на выходе - прилагаю:
http://sendfile.su/828626Сам текст скрипта:
#!/usr/bin/perl
use warnings;
use strict;
# use encoding 'utf8';
my $filename = 0; # начальное имя первого атомарного лог-файла
my $log = "ctl-temp.log";
my @game;
my $logdir = "ctl/";
my $line;
open (WOPLOG, "<", "$log") or die "Can't open file $log: $!";
my $check = 0; # начальное значения флага, взводится в "1" при нахождении первой строки начала игры
while (defined($line=<WOPLOG>))
{
if ($line =~ /^....00..--/)
# if ($line =~ /^\s+0:00 -+/)
{ # если $line - начальная строка игры
if ($check == 0)
{ # если мы ищем первую начальную строку, т. е. $check не взведена
$check = 1;
push @game, $line;
}
else
{ # если мы ищем завершающую строку, т. е. $check взведена в "1"
open (CURRENTLOG, ">", "${logdir}${filename}.log") or die "Cant open Current log file ${filename}.log: $!";
foreach (@game) { print CURRENTLOG "$_" }
close CURRENTLOG;
$check = 0;
$filename++;
@game = (); # обнуляем массив
push @game, $line;
}
}
else
{ # если $line - не начальная строка игры
push @game, $line;
}
}
close WOPLOG;
Спасибо за внимание!
