起初:为我不太好的英语道歉,我是一个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' );
我不知道该如何继续,我将不胜感激。
谢谢: - )
已经感谢您的所有食物!我忘了说我不能在星期一之前测试它,因为我不再工作了,而且我现在也没有来源。但是,谢谢,我相信你的解决方案中至少有一个会起作用!
答案 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方法,可以随意改组列表内容。