2012-01-30 89 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]; 
    } 
}