Как я могу перестроить индексы массива в Perl? - PullRequest
1 голос
/ 04 февраля 2011

Сначала: извиняюсь за мой не очень хороший английский, я 17-летний немец; -)

Я учусь на веб-разработчике и только что наткнулся на проблему:

Мне нужно переставить индексы массива.Массив в основном такой:

@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): Установить элемент index = element index + 1;затем добавьте последний массив в начало и удалите теперь «настоящий» последний массив (который является просто дубликатом начала сейчас).Затем добавьте 1 к счетчику и переделайте это для массива.Но на самом деле это не то, что я хочу.

Ну, это была моя попытка "новичка", так что, опять же, это то, что мне просто нужно:

Мне нужно "переместить" все индексы элементов массива +1 и отрезатьпоследний, чтобы быть в начале.Возможно, более сложная вещь заключается в том, что длина массивов просто переменная.

В другой форме: мне нужно повернуть

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

на

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

Я не знаю, как поступить, и буду признателен за любую помощь.

Спасибо: -)

Уже спасибо за все ваши ответы!Я забыл сказать, что я не могу проверить это до понедельника, потому что я больше не на работе, и у меня нет источника со мной прямо сейчас.Но спасибо, я уверен, что хотя бы одно из ваших решений будет работать!

Ответы [ 3 ]

7 голосов
/ 04 февраля 2011
@array = { 'c', 'a', 'b' };

назначает один элемент (ссылка на хэш) @array; Я думаю, что вы имеете в виду

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

Это для цикла:

for ($#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;

Все это приводит к изменению, которое вам, по-видимому, нужно, но я не уверен, что вы достаточно четко объяснили, что это за изменение, учитывая, насколько сложна ваша попытка по сравнению с тем, что потребуется для выполнения того, что показывает ваш пример. .

4 голосов
/ 04 февраля 2011

Во-первых, используйте круглые скобки для создания массивов в Perl:

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

Если вы хотите переместить последний элемент в начало массива, вы можете использовать:

unshift @array, pop @array;
0 голосов
/ 10 февраля 2011

Я думаю, вы могли бы взглянуть на List :: Util, у него есть метод shuffle, который буквально перемешивает содержимое списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...