我有这样一个二维数组洗牌二维数组中的perl
22950 12
80044 22
02942 06
42018 20
63829 10
...
我想洗牌这个数组随机顺序,像
42018 20
22950 12
...
看起来像一个数据文件List中的'shuffle'可以用来洗牌矢量,如何保持处理这种二维数组?
我有这样一个二维数组洗牌二维数组中的perl
22950 12
80044 22
02942 06
42018 20
63829 10
...
我想洗牌这个数组随机顺序,像
42018 20
22950 12
...
看起来像一个数据文件List中的'shuffle'可以用来洗牌矢量,如何保持处理这种二维数组?
既然你只是洗牌阵列的第一维,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];
埃里克是正确的,你可以洗牌多维数组,就好像他们更愿意e标量。但是,如果你有一个文件,如你的榜样,你可以简单地做:
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。顺便说一句,在你的答案中,我们代表什么? – user288609 2012-01-31 03:30:41
@ user288609:'-lwe'是编写'-l -w -e'的较短方式。这些是激活Perl中的某些行为的标志,这些行为记录在['perldoc perlrun'](http://perldoc.perl.org/perlrun.html) – Zaid 2012-01-31 05:24:44
@ user288609'-l'用于处理行尾,更具体确保在正确的地方有新行。 '-w'是警告,'-e'表示将下列文本作为单行程序运行。 – TLP 2012-01-31 15:32:43