2011-02-04 60 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,它有一个随机洗牌列表内容的洗牌方法。