Spec-Zone.ru › Perl 5.28

arybase

СОДЕРЖАНИЕ

  • ИМЯ
  • СИНТАКСИС
  • ОПИСАНИЕ
  • ИСТОРИЯ
  • ОШИБКИ
  • СМОТРИТЕ ТАКЖЕ

ИМЯ

arybase - Установка базового индекса массива через $[

СИНТАКСИС

$[ = 1;

@a = qw(Sun Mon Tue Wed Thu Fri Sat);
print $a[3], "\n";  # prints Tue

ОПИСАНИЕ

Этот модуль реализует переменную Perl $[. Не следует использовать её напрямую.

Присваивание $[ имеет эффект на этапе компиляции, устанавливая присвоенное значение (преобразованное в целое число) в качестве индекса первого элемента в массиве и первой буквы в подстроке в рамках окружающего лексического пространства.

Его можно записать с использованием или без local:

$[ = 1;
local $[ = 1;

Он работает только в том случае, если присваивание может быть обнаружено на этапе компиляции, и присвоенное значение является константой.

Он влияет на следующие операции:

$array[$element]
@array[@slice]
$#array
(list())[$slice]
splice @array, $index, ...
each @array
keys @array

index $string, $substring  # return value is affected
pos $string
substr $string, $offset, ...

Как и в случае с базовым значением 0, отрицательные базы считаются с конца массива или строки, начиная с -1. Если $[ является положительным целым числом, индексы от $[-1 до 0 также считаются с конца. Если $[ отрицательно (хотя зачем так делать?), индексы от $[ до 0 считаются с начала строки, но индексы ниже $[ считаются с конца строки так, как будто база равна 0.

До Perl 5.16 индексы от 0 до $[-1 включительно для положительных значений $[ вели себя по-разному для разных операций; отрицательные индексы, равные или большие, чем отрицательное значение $[ также вели себя несогласованно.

ИСТОРИЯ

До Perl 5, $[ была глобальной переменной, которая влияла на все индексы массивов и смещения строк.

Начиная с Perl 5, она стала директивой на этапе компиляции, охватывающей весь файл, которую можно было сделать лексически-ограниченной с помощью local. "Охватывающая весь файл" означает, что присваивание $[ могло "просочиться" за пределы блока, в котором оно выполнялось:

{
    $[ = 1;
    # ... array base is 1 here ...
}
# ... still 1, but not in other files ...

В Perl 5.10 она стала строго лексической. Поведение, охватывающее весь файл, было удалено (возможно, по неосторожности, но что сделано, то сделано).

В Perl 5.16 реализация была перемещена в этот модуль и вынесена из ядра Perl. Несогласованное поведение, которое происходило с индексами между -1 и $[ было сделано согласованным между операциями, а для отрицательных баз индексы от $[ до -1 включительно были сделаны согласованными между операциями.

ОШИБКИ

Сообщения об ошибках, которые упоминают индексы массивов, используют нулевую базу.

keys $arrayref и each $arrayref не учитывают текущее значение $[.

СМОТРИТЕ ТАКЖЕ

"$[" в perlvar, Array::Base и String::Base.

© 1993–2020 Larry Wall and others
Licensed under the GNU General Public License version 1 or later, or the Artistic License.
The Perl logo is a trademark of the Perl Foundation.
https://perldoc.perl.org/5.28.3/arybase

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API