Могу поспорить, что настоящие Perl-хакеры разорвут это на части, но, тем не менее, это так.
use strict;
use warnings;
use List::Util 'shuffle';
my @lines = ();
my $bufsize = 512;
while(<STDIN>) {
push @lines, $_;
if (@lines == $bufsize) {
print shuffle(@lines);
undef @lines;
}
}
print shuffle(@lines);
Разница между этим и другим решением:
- Не будет потреблять весь ввод и затем рандомизировать его (увеличение памяти), но будет рандомизировать каждые строки $ bufsize (не совсем случайные и медленные, как собака, по сравнению с другим вариантом).
- Использует модуль, который возвращает новый список вместо редактирования Fisher - Yates на месте. Они являются взаимозаменяемыми (за исключением того, что вы должны отделить печать от случайного воспроизведения). Для получения дополнительной информации наберите perldoc -q rand в вашей оболочке.