Я выполняю следующий код, и я пытаюсь распечатать первый элемент в @rainbow
массив через пятый последний элемент в @rainbow
массив. Этот код работает на любые положительные индексы в границах измерения массива, но не для отрицательных:
@rainbow = ("a".."z");
@slice = @rainbow[1..-5];
print "@slice\n";
Хотите
my @slice = @rainbow[0 .. $#rainbow - 5];
Будьте осторожны, 1 - это второй элемент, а не первый.
Оператор ..
формирует диапазон слева направо, если вправо больше или равно слева. Также в Perl индексирование массива начинается с нуля.
Как насчет этого?
@slice = @rainbow[0..$#rainbow-5];
$ # Array
дает вам индекс последнего элемента в массиве.
Из первых двух предложений для оператора диапазона , документированных в Perlop :
двоичный «..» - оператор диапазона, который действительно два разных оператора в зависимости от контекст. В контексте списка он возвращает список значений, подсчитав (вверх по теми) из левого значения в правильное значение. Если левое значение больше, чем правильное значение, он возвращает пустой список.
Когда код не работает, разложите его, чтобы увидеть, что происходит. Например, вы бы попробовали оператор диапазона, чтобы увидеть, что он произвел:
my @indices = 1 .. -5;
print "Indices are [@indices]\n";
, когда вы получили пустой список и поняли, что есть что-то, что вы не понимаете, проверьте документацию для того, что вы пытаетесь сделать, чтобы сделать Проверьте, что делает то, что вы думаете, что это должно делать. :)