Если необходимо использовать dash
, это будет работать:
mkfifo file1
mkfifo file2
xzcat file1.xz >file1&
xzcat file2.xz >file2&
diff file1 file2
rm -f file1 file2 #remove the FIFOs
Решение заключается в простом использовании итераторов
.
Присваивая результаты вариации_с_повторением
скаляру, он генерирует итератор, который можно опрашивать каждый раз, чтобы получить следующий элемент. Таким образом, Вы не будете хранить весь список в памяти и немедленно получите доступ к первым элементам. Это прекрасная концепция, называемая ленивой оценкой .
Вот код для вашего случая:
use strict;
use warnings;
use Algorithm::Combinatorics 'variations_with_repetition';
my @let = qw / A G C T/;
my $cad = variations_with_repetition(\@let,24);
while(my $c = $cad->next)
{
print "@$c\n";
}
Просто заметьте, что итератор на самом деле возвращает ссылку на массив, на который вы должны сначала разыменовать ссылку, а затем присоединить или сделать любую операцию, которая вам нравится.
Результаты тестирования: Я не смог запустить исходный код на своей машине (использование памяти растет бесконечно, как и ожидалось), но используя итераторы, я сразу же начал получать выходные строки, при этом perl практически не потреблял памяти.
Ну, перечисление слова, написанные на алфавите (A, G, C, T), много так же, как считая в базе четыре. Зная это (удалить звонок голова; Это только для того, чтобы усечить очень длинный вывод во время тестирования):
{ echo 4o; seq 0 $((4 ** 24 - 1)) | sed 's/$/p/'; } | dc | awk '{ printf "%024d\n", $1 }' | tr 0-4 AGCT | head
Объяснение:
Echo 4o
- это команда, которая дает инструкции DC
для вывода в базе четырех;
SEQ
просят рассчитывать на весь диапазон, что 24-значные базы четырех номеров;
SED
добавляет P
к каждой строке, чтобы спросить DC
, чтобы распечатать каждый Номер (в базе четыре, помните);
awk
awk предъявит достаточно нулевых нулей, чтобы сделать количество печати 24 цифры;
TR
переводит цифры (0, 1, 2, 3) в алфавит (A , G, C, T).