2011-02-04 66 views
1

起初:道歉我不那麼流利的英語,我是一個17歲的德國;-)如何在Perl中重新排列數組索引?

我做我徒弟作爲一個Web開發者,只是偶然發現了一個問題:

我需要重新排列數組的索引。該陣列基本上是這樣的:

@array = ('a', 'b', 'c'); 

但是:它是動態變化的,所以它不總是有3個要素的事,但20多個。現在,我需要做的是得到它:

@array = ('c', 'a', 'b'); 

所以,我想我只是需要做這樣的事情(在for循環,對於每一個元素循環一旦在陣列和增量$計數器)

my $last = $array[$#array]; 
for($#array) 
{ 
    $array[$counter] = $array[$counter + 1]; 
    unshift(@array, $last); 
    pop(@array); 
    $counter++; 
} 

我認爲它會做到這一點:

對於數組中的每個元素(可以說,我們在元素0):Set element index = element index + 1;然後將最後一個數組添加到開頭,然後移除現在的「真正的」最後一個數組(這只是現在開始的一個副本)。然後加1到計數器並重做數組。但它並沒有真正做我想要的。

嗯,這是我的「新手」嘗試,如此反覆,這就是我只需要:

我需要「移動」的所有元素的數組+1的指標,並切斷了最後一個再到在開始時。也許更復雜的是,數組長度只是可變的。

在另一種形式: 我需要把

('a', 'b', 'c', 'd', ... 'z'); 

('z', 'a', 'b', 'c', ... 'y'); 

Ive得到了不知道如何繼續下去,我希望得到任何幫助。

感謝:-)

已經感謝您的anwers!我忘了說星期一之前我不能測試它,因爲我現在不工作了,現在我也沒有與我聯繫。但是,謝謝,我確定至少有一個解決方案可以工作!

回答

4

首先,使用圓括號在Perl中創建數組:

@array = ('a', 'b', 'c'); 

如果你想移動到數組的開頭,最後一個元素,你可以使用:

unshift @array, pop @array; 
+0

對不起。我只是寫了那個在我腦海裏的家。原來,我只是用push來填充數組(它完全像我想要的那樣)。 – 2011-02-04 16:28:53

7
@array = { 'c', 'a', 'b' }; 

爲@array分配一個元素(一個哈希引用);我想你的意思

@array = ('c', 'a', 'b'); 

for循環:

for ($#array) 

只遍歷單值$#數組(@array的最後一個索引)。

我猜你的意思是這樣的:

for (0..$#array) 

(遍歷所有數組索引)。

在你的循環中,你似乎在做兩件不同的事情;一個旋轉的東西與unshift /流行和一個移動的東西與分配的元素。無論哪種方法都行得通(儘管在兩個方面你都有錯誤),但兩者都不會。

可以執行:

my $last = $array[$#array]; 
for (0..$#array-1) { 
    $array[$_+1] = $array[$_]; 
} 
$array[0] = $last; 

(不需要單獨的計數器;所述迴路提供一個)

或被一個之外還有旋轉(移動所述第一元件是最後一個)的陣列少一個次是要素:

for (1..$#array) { 
    push @array, shift @array; 
} 

或只是做到這一點採取的最後一個元素和第一使它:

unshift @array, pop @array; 

或者你可以一次重新分配所有的元素,用切片:

@array = @array[ $#array, 0..$#array-1 ]; 

@array[1..$#array, 0] = @array; 

所有這些產生你似乎想改變,但我不覺得相信你已經足夠清楚地解釋了這種變化是什麼,考慮到你的嘗試與你的例子所要做的事情相比有多複雜。

+0

+1有一個很好的和詳細的解釋。 – Ibrahim 2011-02-04 16:42:55

0

我想你可能想看看List :: Util,它有一個隨機洗牌列表內容的洗牌方法。