How can I print the lines in STDIN in random order in Perl?

前端 未结 3 1778
遇见更好的自我
遇见更好的自我 2020-12-17 06:17

I want to do the inverse of sort(1) : randomize every line of stdin to stdout in Perl.

3条回答
  •  囚心锁ツ
    2020-12-17 06:46

    This perl snippet does the trick :

    #! /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__
    

提交回复
热议问题