当前位置:  开发笔记 > 编程语言 > 正文

如何在Perl中以随机顺序打印STDIN中的行?

如何解决《如何在Perl中以随机顺序打印STDIN中的行?》经验,为你挑选了3个好方法。

我想做sort(1)的逆:在stl中将stdin的每一行随机化为stdout.



1> Vinko Vrsalo..:

我敢打赌,真正的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.



2> Steve Schnep..:

这个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__



3> ysth..:
use List::Util 'shuffle';
print shuffle <>

或者如果你担心最后一行缺少\n,

chomp(my @lines = <>);
print "$_\n" for shuffle @lines;

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有