解决方法
我敢打赌,真正的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实现.它们是可以互换的(除了你必须将印刷品与洗牌分开).有关更多信息,请在shell上键入perldoc -q rand.