2012-01-30 78 views
2

我有这样一个二维数组洗牌二维数组中的perl

22950 12 
80044 22 
02942 06 
42018 20 
63829 10 
... 

我想洗牌这个数组随机顺序,像

42018 20 
22950 12 
... 

看起来像一个数据文件List中的'shuffle'可以用来洗牌矢量,如何保持处理这种二维数组?

回答

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

埃里克是正确的,你可以洗牌多维数组,就好像他们更愿意e标量。但是,如果你有一个文件,如你的榜样,你可以简单地做:

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

感谢,TLP。顺便说一句,在你的答案中,我们代表什么? – user288609 2012-01-31 03:30:41

+0

@ user288609:'-lwe'是编写'-l -w -e'的较短方式。这些是激活Perl中的某些行为的标志,这些行为记录在['perldoc perlrun'](http://perldoc.perl.org/perlrun.html) – Zaid 2012-01-31 05:24:44

+0

@ user288609'-l'用于处理行尾,更具体确保在正确的地方有新行。 '-w'是警告,'-e'表示将下列文本作为单行程序运行。 – TLP 2012-01-31 15:32:43

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