在perl中改组二维数组

时间:2012-01-30 23:56:01

标签: arrays perl

我有一个像二维数组

的数据文件
22950   12
80044   22
02942   06
42018   20
63829   10
...

我想将这个数组随机排列,比如

42018   20
22950   12
...

看起来像是' shuffle'在List中可以用来随机播放一个向量,如何处理这种二维数组呢?

3 个答案:

答案 0 :(得分:6)

由于您只是改组数组的第一维,List::Util::shuffle无需任何修改即可使用。

Perl没有多维数组,它有标量数组,每个标量也可以是一个数组。这实际上是一个多维数组,但这意味着您可以使用像shuffle这样的常规数组操作,因为shuffle并不关心数组的值是什么(在这种情况下它们将是其他数组)。

所以行:

my @random = shuffle \@array1, \@array2, \@array3;

相同
my @random = shuffle 1, 2, 3;

shuffle而言(要洗牌的3个元素的列表)。

所以假设您的2D数据包含在数组@data

my @data = (
    [1234, 34],
    [4564, 45],
    ...
);

然后你会写:

use List::Util 'shuffle';
my @random = shuffle @data;

然后你会正常访问2D结构:

say $random[0][1];

答案 1 :(得分:2)

Eric是正确的,你可以将多维数组洗牌,就好像它们是标量一样。但是,如果您的示例中包含文件,则可以执行以下操作:

perl -MList::Util=shuffle -lwe 'print shuffle <>' input.txt > output.txt

答案 2 :(得分:0)

我会使用没有模块的东西,比如:

use strict;
use warnings;

my @liste = (['22950','12'],
['80044','22'],['02942','06'],['42018','20'],['63829','10']);

print $_->[0], ' ',$_->[1], "\n" foreach ( @liste);

foreach (1 .. 10) {
  fisher_yates_shuffle( \@liste );
  print "=======\n";
  print $_->[0], ' ',$_->[1], "\n" foreach ( @liste);
}

sub fisher_yates_shuffle {
    my $deck = shift;  # $deck is a reference to an array
    my $i = @$deck;
    while (--$i) {
        my $j = int rand ($i+1);
        @$deck[$i,$j] = @$deck[$j,$i];
    }
}