Funkcja push() w Perl

W języku programowania Perl jest wbudowana funkcja push(). Za pomocą tej funkcji można dodawać elementy na koniec Perl tablicy.

Oto przykład:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

my @arr = (1, 2);

push @arr, undef, 'Hello', 8;

print Dumper \@arr;

W tym programie określa tablica @arr z dwoma elementami. Dalej za pomocą funkcji push() w tym szyku dodają jeszcze 3 elementy. undef, wiersz 'Hello' i liczba 8.

Wynik działania tego programu:

$VAR1 = [
          1,
          2,
          undef,
          'Hello',
          8
        ];

Argumenty

push(@arr, $value1, $value2);
push(@arr, @other_arr);
push(@arr, @other_arr, @and_the_other_arr);

Standardowe korzystanie z funkcji push() — to przekazać w niej nie mniej niż dwóch elementów.

Pierwszy element musi być tablica (w niektórych wersjach Perla pierwszy element jeszcze może być odwołaniem do tablicy, ale to stosowanie nie jest zalecane, szczegóły w innym dziale poniżej)

Następujące argumenty — to zwykle скаляры lub tablice. W tablicy z pierwszego argument zostaną dodane wszystkie elementy z takich argumentów.

Jako argument można podać hash push(@arr, %hash). W tablicy @arr zostaną dodane wszystkie pary klucz-wartość z mieszania (tu jest cechą porządek wartości mieszania неопределен i różne uruchomienia tego samego programu mogą tworzyć elementy tablicy w różnych sekwencjach). Ale w prawdziwym życiu korzystanie z mieszania jako argument funkcji push() spotyka się rzadko.

Jeśli nie podać ani jednego argumentu, to będzie błąd:

Not enough arguments for push at script.pl line 3, near "push()"
Execution of script.pl aborted due to compilation errors.

Jeśli podać jeden argument i ten argument tablicę push(@arr);, to błędu nie będzie, to w żaden sposób nie zmieni szyk, ale jeśli w kodzie jest use warnings;, to będzie ostrzeżenie:

Useless use of push with no values at script.pl line 8.

Wartość zwracana

Funkcja push() zwraca liczbę elementów, które stało się w tablicy po wykonywania tej funkcji.

my $number = push(@arr, $value);

Ten kod jest podobny do takiego kodu:

push(@arr, $value);
my $number = scalar(@arr);

Wartość zwracana push() muszą nie bardzo często. Bardzo często używany push(@arr, $value), a zwracana wartość jest ignorowana.

Korzystanie z ARRAYREF jako pierwszy argument

Standardowe korzystanie z funkcji push() — pierwszy argument to tablica, do którego dodawane są elementy z wszystkich pozostałych argumentów.

Ale w języku programowania Perl był eksperyment. W przypadku, gdy pierwszy argument to odwołanie do tablicy, to funkcja push()sama robiłam cofając tej linki i dodawał dane w tablicy.

Oto kod.

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my $arr = [];

push $arr, 1;

warn Dumper $arr;

Perl do wersji 5.12 (włącznie) na ten kod generuje błąd:

Type of arg 1 to push must be array (not private variable) at script.pl line 9, near "1;"
Execution of script.pl aborted due to compilation errors.

Począwszy od wersji Perl 5.14 i do wersji 5.18 (włącznie) to kod dodawał element w ARRAYREF i wynik był:

$VAR1 = [
          1
        ];

Perl 5.20 i 5.22 też dodawał element w ARRAYREF, ale wraz z tym jeszcze i podawał ostrzeżenie:

push on reference is experimental at script.pl line 9.
$VAR1 = [
          1
        ];

A od wersji 5.24 ten kod już zgłasza błąd:

Experimental push on scalar is now forbidden at script.pl line 9, near "1;"
Execution of script.pl aborted due to compilation errors.

Tym фичей języka używać nie jest zalecane. Jeśli trzeba dodać element w ARRAYREF, to najlepiej napisać wyraźnie push @{$arr}, 1; zamiast push $arr, 1;

Oto kod, który tak samo działa na wszystkich wersjach Perla:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my $arr = [];

push @{$arr}, 1;

warn Dumper $arr;

Oficjalna dokumentacja

Oto wynik polecenia perldoc -f push:

       push ARRAY,LIST
       push EXPR,LIST
               Treats ARRAY as a stack by appending the values of LIST to the
               end of ARRAY.  The length of ARRAY increases by the length of
               LIST.  Has the same effect as

                   for $value (LIST) {
                       $ARRAY[++$#ARRAY] = $value;
                   }

               but is more efficient.  Returns the number of elements in the
               array following the completed "push".

               Starting with Perl 5.14, "push" can take a scalar EXPR, which
               must hold a reference to an unblessed array.  The argument will
               be dereferenced automatically.  This aspect of "push" is
               considered highly experimental.  The exact behaviour may change
               in a future version of Perl.

               To avoid confusing would-be users of your code who are running
               earlier versions of Perl with mysterious syntax errors, put
               this sort of thing at the top of your file to signal that your
               code will work only on Perls of a recent vintage:

                   use 5.014;  # so push/pop/etc work on scalars (experimental)

Tematy pokrewne

Inne artykuły