如何在Perl中重新排列数组索引?

时间:2011-02-04 16:08:29

标签: arrays perl

起初:为我不太好的英语道歉,我是一个17岁的德国人; - )

我作为网络开发人员做我的学徒,只是偶然发现了一个问题:

我需要重新排列数组的索引。该数组基本上是这样的:

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

但是:它会动态变化,因此它并不总是有3个元素,而是20个以上的元素。现在,我需要做的就是将它变为:

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

所以,我认为我只需要做类似的事情(在一个for循环中,为数组中的每个元素循环一次并递增$ counter)

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

我认为它会这样做:

对于数组中的每个元素(假设我们在元素0):设置元素索引=元素索引+ 1;然后将最后一个数组添加到开头并删除现在的“真实”最后一个数组(这只是现在开头的副本)。然后将1添加到计数器并重做该数组。但它并没有真正做我想要的。

嗯,这是我的“新手”尝试,再次,这就是我所需要的:

我需要“移动”数组+1的所有元素索引,并切断最后一个,然后在开头。可能更复杂的是,数组长度只是可变的。

另一种形式: 我需要转

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

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

我不知道该如何继续,我将不胜感激。

谢谢: - )

已经感谢您的所有食物!我忘了说我不能在星期一之前测试它,因为我不再工作了,而且我现在也没有来源。但是,谢谢,我相信你的解决方案中至少有一个会起作用!

3 个答案:

答案 0 :(得分:7)

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

将单个元素(哈希引用)分配给@array;我想你的意思是

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

这个for循环:

for ($#array)

仅循环遍历单个值$#array(@array的最后一个索引)。

我猜你的意思是:

for ( 0..$#array )

(遍历所有数组指示)。

在你的循环中,你似乎做了两件不同的事情;一个用unshift / pop旋转的东西和一个带有元素赋值的移动的东西。这两种方法都可行(尽管两者都有错误),但两者都不会。

你可以这样做:

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;

所有这些都会产生你想要的改变,但我不相信你已经清楚地解释了这种改变是什么,考虑到你的尝试与你的例子显示的内容相比有多复杂

答案 1 :(得分:4)

首先,使用圆括号在Perl中创建数组:

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

如果要将最后一个元素移动到数组的开头,可以使用:

unshift @array, pop @array;

答案 2 :(得分:0)

我想你可能想看一下List :: Util,它有一个shuffle方法,可以随意改组列表内容。