Несколько десятков отправителей пишут письма в компанию. Их письма попадают в файл. Это обычный текстовый файл, длина строк в котором не превышает 1000 байт, а письма следуют одно за другим. Пример файла можно скачать по адресу http://italy-vms.ru/files/test/unix.mailbox.zip
Признак начала письма - строка, отвечающая следующим правилам: строка начинается словом From, сразу за которым следует один пробел, сразу за ним следует e-mail отправителя, за ним - пробел и какая-то дополнительная информация. Писем очень много, некоторые из них могут иметь большой объем (максимальный объем письма не ограничен). Объём входного файла может составлять много гигабайт. При этом количество разных отправителей не превышает 100. Напишите программу на Perl, которая преобразует этот файл во множество файлов по следующим правилам:
-
формат выходных файлов идентичен формату входного файла;
-
для каждого отправителя должна быть выделена своя директория. Имя не имеет значения. Все письма одного отправителя должны располагаться в файлах одной директории;
-
каждый из выходных файлов может содержать одно или несколько писем. Имена файлов не имеют значения. При этом не допускается разбивать одно письмо по нескольким файлам;
-
следует удерживать размер выходных файлов близким к некоему задаваемому заранее значению (параметром, в конфигурации или иным способом). Допускается следующий простой алгоритм ограничения размера: когда в процессе записи файл достигает указанного значения, текущее письмо дописывается в этот файл, а следующее письмо этого отправителя записывается уже в новый файл. Необязательно реализовывать именно этот алгоритм, но меры по ограничению размера отдельных файлов должны присутствовать.
При реализации учитывайте следующие ограничения:
-
как упоминалось выше, входной файл может быть очень большим, кроме того, считайте, что в будущем ваша программа может быть модифицирована на прием потоковых данных и беспрерывную работу. Поэтому организуйте работу таким образом, чтобы данные входного файла читались только один раз;
-
старайтесь не держать в памяти лишних данных, в частности, не забывайте, что объем одного письма не ограничен;
-
выходные файлы должны открываться и закрываться только один раз;
-
в программе не должны использоваться сторонние модули;
-
решение ожидается в виде одного относительно короткого файла, не нужно усложнять решение каким-то дополнительным функционалом, проверками данных и т.п.;
-
используйте, как минимум, strict;
Кроме того, обратите внимание, что пример файла не призван проверить все указанные правила работы с письмами.