Indeks pierwszego elementu w tablicy Perl

W języku programowania Perl, jak i w wielu innych językach programowania, pierwszy element tablicy ma indeks 0. Ale była możliwość (której nie zaleca się korzystać z) zrobić aby indeks pierwszego elementu był 1 (lub inna liczba).

Oto przykład kodu:

▶ Run
#!/usr/bin/perl

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

print $arr[1];

Program wyświetla na ekranie tekst two. Zwracamy się do elementu tablicy o indeksie 1 i ten drugi element tablicy.

  • indeks 0 — jest to pierwszy element w tablicy, w naszym przykładzie linia 'one'
  • indeks 1 — znajduje się drugi element tablicy, w naszym przykładzie linia 'two'
  • indeks 2 — jest trzeci element tablicy, w naszym przykładzie linia 'three'

Dla osób uczących się programowania to dziwne, ale to standard. 0 to indeks pierwszego elementu tablicy praktycznie we wszystkich językach programowania.

Zmienna $[

Twórcy języka programowania Perl chcieli zrobić język tak aby programista sam decydował jak chce używać tego języka (zasada TIMTOWTDI), dlatego w języku został sposób zmienić indeks pierwszego elementu. Jeśli komuś niewygodne używać 0 jako indeks pierwszego elementu, można było powiedzieć że indeks pierwszego elementu będzie 1.

Oto przykład kodu:

#!/usr/bin/perl

$[ = 1;

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

print $arr[1];

Ustawiamy wartość specjalnej zmiennej w jednostce $[ = 1; — tym mówimy i co teraz indeks pierwszego elementu będzie 1, a nie 0. Program wyświetla na ekranie tekst one.

Ale bardzo szybko stało się jasne, że ta możliwość niczego nie ułatwia, a wręcz utrudnia pracę z kodem. Oto otwierasz program i przed tym, jak w niej coś zmienić, trzeba najpierw zrozumieć jak odbywa się praca z tablicą.

Dlatego począwszy od wersji Perl 5.12 użycie zmiennej $[ prowadziło do pojawienia się ostrzeżenia: Use of assignment to $[ is deprecated at script.pl line 3..

W Wersji Perl 5.12, 5.14, 5.16, 5.18, 5.20, 5.22. 5.24, 5.26 dali to ostrzeżenie. 5.28 stał się ostrzeżenie Use of assignment to $[ is deprecated, and will be fatal in Perl 5.30 at script.pl line 3., a Perl 5.30 przestał dawać możliwość zmiany indeks pierwszego elementu. Gdy próbuje to zrobić program zakończyć się z tekstem błędu Assigning non-zero to $[ is no longer possible at script.pl line 3..

Tak, że w nowszych wersjach języka Perl pierwszy element tablicy ma indeks 0. W Perlu do tej wersji jest możliwość zrobić inny numer indeksu pierwszego elementu, ale najlepiej z tej okazji nigdy nie używać.

Oficjalna dokumentacja

Oto fragment danych wyjściowych polecenia perldoc perlvar o zmiennej $[:

    $[      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.

Inne artykuły