Arrays 在perl中洗牌二维数组

Arrays 在perl中洗牌二维数组,arrays,perl,Arrays,Perl,我有一个类似于二维数组的数据文件 22950 12 80044 22 02942 06 42018 20 63829 10 ... 我想把这个数组随机排列,比如 42018 20 22950 12 ... 看起来列表中的“shuffle”可以用来洗牌向量,如何处理这种二维数组?由于您只洗牌数组的第一个维度,List::Util::shuffle将在不做任何修改的情况下工作 Perl没有多维数组,它有标量数组,每个标量也可以是数组。这实际上是一个多维数组,但这意味着

我有一个类似于二维数组的数据文件

22950   12
80044   22
02942   06
42018   20
63829   10
...
我想把这个数组随机排列,比如

42018   20
22950   12
...

看起来列表中的“shuffle”可以用来洗牌向量,如何处理这种二维数组?

由于您只洗牌数组的第一个维度,
List::Util::shuffle
将在不做任何修改的情况下工作

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

所以这句话:

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

my @random = shuffle 1, 2, 3;
就洗牌而言(要洗牌的3个元素的列表)

因此,假设您的2D数据包含在数组
@data

my @data = (
    [1234, 34],
    [4564, 45],
    ...
);
那么你就写:

use List::Util 'shuffle';
my @random = shuffle @data;
然后您可以正常访问二维结构:

say $random[0][1];

Eric是正确的,您可以将多维数组当作标量来洗牌。但是,如果您有一个如示例中所示的文件,您只需执行以下操作:

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

我将使用一些没有模块的东西,比如:

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];
    }
}

谢谢,TLP。顺便问一下,-lwe在你的答案中代表什么?@user288609:
-lwe
是一种较短的书写方式
-l-w-e
。这些标志激活了Perl中的某些行为,这些行为记录在@user288609
-l
中,用于处理行尾,更具体地说,确保在正确的位置有换行符
-w
是警告,
-e
表示将以下文本作为一行程序运行。