我想做sort(1)的逆:在stl中将stdin的每一行随机化为stdout.
我敢打赌,真正的Perl黑客会把它拆开,但在这里仍然如此.
use strict; use warnings; use List::Util 'shuffle'; my @lines = (); my $bufsize = 512; while() { push @lines, $_; if (@lines == $bufsize) { print shuffle(@lines); undef @lines; } } print shuffle(@lines);
这与其他解决方案的区别:
不会消耗所有输入然后随机化它(内存猪),但会随机化每个$ bufsize线(与其他选项相比,不是真正随机和慢的狗).
使用一个返回新列表的模块,而不是编辑Fisher-Yates实现的模块.它们是可以互换的(除了你必须将印刷品与洗牌分开).有关更多信息,请在shell上键入perldoc -q rand.
这个perl片段可以解决这个问题:
#! /usr/bin/perl # randomize cat # fisher_yates_shuffle code copied from Perl Cookbook # (By Tom Christiansen & Nathan Torkington; ISBN 1-56592-243-3) use strict; my @lines = <>; fisher_yates_shuffle( \@lines ); # permutes @array in place foreach my $line (@lines) { print $line; } # fisher_yates_shuffle( \@array ) : generate a random permutation # of @array in place sub fisher_yates_shuffle { my $array = shift; my $i; for ($i = @$array; --$i; ) { my $j = int rand ($i+1); next if $i == $j; @$array[$i,$j] = @$array[$j,$i]; } } __END__
use List::Util 'shuffle'; print shuffle <>
或者如果你担心最后一行缺少\n,
chomp(my @lines = <>); print "$_\n" for shuffle @lines;