> Пишу пакетный обработчик больших текстовых файлов (более Гб) По нынешним временам - ни фига не большой. Засоси в массив по строке на элемент массива и играйся.
Кошерно тоже можно, только ненужной возни больше.
> 1) Напечатать все строки, которые на 10 выше искомой и на 5
Сделай кольцевой буфер на 16 элементов. Набей строками. Потом проверь 11-й элемент. Если совпало, забирай первый и последний. Можешь взять RingBuffer с CPAN, можешь сам написать - штука достаточно тривиальная.
Если совсем лень возиться - набивай строки в список с помощью push, выбрасывай с помощью shift, всё время проверяя 11-й элемент:
for (my $i=0; $i< 15; $i++) {
push @buff, scalar(<>);
}
while (<>) {
push @buff, $_;
if ($buff[10] =~ /regexp/) {
print @buff[0,10,15];
... other stuff ...
}
shift @buf;
}
> 2) Найти строку по ключу, провести поиск вверх по другому ключу и
> напечатать найденную строку. И так для всех ключевых строк.
Я бы это за два прохода сделал. Сначала сделал индекс первых ключей - где сидят и кто у них второй ключ, за второй проход нашёл ближайшие вторые ключи и вывел их.
Если ключей ожидается больше, чем доступной памяти, используй Tie::File или DBM.