Индекс первого элемента в Perl массиве

В языке программирования Perl, как и во множестве других языков программирования, первый элемент в массиве имеет индекс 0. Но была возможность (которой настоятельно не рекомендуется пользоваться) сделать чтобы индекс первого элемента был 1 (или другое число).

Вот пример кода:

▶ Run
#!/usr/bin/perl

my @arr = ('one', 'two', 'three');

print $arr[1];

Программа выведет на экран текст two. Мы обращаемся к элементу массива с индексом 1 и этой второй элемент массива.

  • индекс 0 — находится первый элемент массива, в нашем примере строка 'one'
  • индекс 1 — находится второй элемент массива, в нашем примере строка 'two'
  • индекс 2 — находится третий элемент массива, в нашем примере строка 'three'

Для изучающих программирование это непривычно, но это стандарт. 0 это индекс первого элемента массива практически во всех языках программирования.

Переменная $[

Создатели языка программирования Perl хотели сделать язык таким чтобы программист сам решал как он хочет использовать этот язык (принцип TIMTOWTDI), поэтому в языке был способ изменить индекс первого элемента. Если кому-то неудобно использовать 0 в качестве индекса первого элемента, можно было сказать что индексом первого элемента будет 1.

Вот пример кода:

#!/usr/bin/perl

$[ = 1;

my @arr = ('one', 'two', 'three');

print $arr[1];

Устанавливаем значение специальной переменной в единицу $[ = 1; — этим говорим что теперь индекс первого элемента будет 1, а не 0. Программа выведет на экран текст one.

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

Поэтому начиная с версии Perl 5.12 использование переменной $[ приводило к появлению предупреждения: Use of assignment to $[ is deprecated at script.pl line 3..

Версии Perl 5.12, 5.14, 5.16, 5.18, 5.20, 5.22. 5.24, 5.26 выдавали именно это предупреждение. 5.28 стал выдавать предупреждение Use of assignment to $[ is deprecated, and will be fatal in Perl 5.30 at script.pl line 3., а Perl 5.30 перестал давать возможность менять индекс первого элемента. При попытке это сделать программа завершиться с текстом ошибки Assigning non-zero to $[ is no longer possible at script.pl line 3..

Так что в свежих версиях языка Perl первый элемент массива всегда имеет индекс 0. В Perl до этой версии есть возможность сделать другое число индексом первого элемента, но лучше всего этой возможностью никогда не пользоваться.

Официальная документация

Вот фрагмент вывода команды perldoc perlvar про переменную $[:

    $[      This variable stores the index of the first element in an array,
            and of the first character in a substring. The default is 0, but
            you could theoretically set it to 1 to make Perl behave more
            like awk (or Fortran) when subscripting and when evaluating the
            index() and substr() functions.

            As of release 5 of Perl, assignment to $[ is treated as a
            compiler directive, and cannot influence the behavior of any
            other file. (That's why you can only assign compile-time
            constants to it.) Its use is highly discouraged.

            Prior to Perl v5.10.0, assignment to $[ could be seen from outer
            lexical scopes in the same file, unlike other compile-time
            directives (such as strict). Using local() on it would bind its
            value strictly to a lexical block. Now it is always lexically
            scoped.

            As of Perl v5.16.0, it is implemented by the arybase module.

            As of Perl v5.30.0, or under "use v5.16", or "no feature
            "array_base"", $[ no longer has any effect, and always contains
            0. Assigning 0 to it is permitted, but any other value will
            produce an error.

            Mnemonic: [ begins subscripts.

            Deprecated in Perl v5.12.0.

Другие статьи

Комментарии