Как я могу напечатать первый в пятый из последних элементов массива в Perl? - PullRequest
22 голосов
/ 08 января 2010

Я запускаю следующий код и пытаюсь напечатать первый элемент в массиве @rainbow через пятый элемент из последнего в массиве @rainbow. Этот код работает для любых положительных индексов в пределах массива, но не для отрицательных:

@rainbow = ("a".."z");
@slice = @rainbow[1..-5];
print "@slice\n";

Ответы [ 3 ]

39 голосов
/ 08 января 2010

Вы хотите

my @slice = @rainbow[0 .. $#rainbow - 5];

Будьте осторожны, 1 - это второй элемент, а не первый.

18 голосов
/ 08 января 2010

Оператор .. формирует диапазон слева направо - если справа больше или равно левому Также в Perl индексация массива начинается с нуля.

Как насчет этого?

@slice = @rainbow[0..$#rainbow-5];

$#array дает индекс последнего элемента в массиве.

5 голосов
/ 08 января 2010

Из первых двух предложений для оператора диапазона , задокументировано в perlop :

Двоичный ".." - это оператор диапазона, который в действительности зависит от контекста. В контексте списка он возвращает список значений, считая (с увеличением на единицу) от левого значения к правому значению. Если левое значение больше правого, возвращается пустой список.

Когда код не работает, разложите его, чтобы увидеть, что происходит. Например, вы бы попробовали оператор диапазона, чтобы увидеть, что он произвел:

 my @indices = 1 .. -5;
 print "Indices are [@indices]\n";

Когда вы получили пустой список и поняли, что происходит что-то, чего вы не понимаете, проверьте документацию на предмет того, что вы пытаетесь сделать, чтобы убедиться, что он делает то, что, по вашему мнению, должен делать. :)

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