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
表示将以下文本作为一行程序运行。