Chức năng push() trong Perl

Perl ngôn ngữ đã được tích hợp trong chức năng push(). Này, bạn có thể thêm yếu tố đến sự kết thúc của Perl mảng.

Đây là một ví dụ:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

my @arr = (1, 2);

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

print Dumper \@arr;

Chương trình này xác định một mảng @arr với hai yếu tố. Sau đó, sử dụng các chức năng push() trong mảng này thêm một 3 mục. undef, dòng 'Hello' và số 8.

Đầu ra từ chương trình này:

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

Lập luận

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

Tiêu chuẩn bằng cách sử dụng push() là vượt qua nó là không ít nhất hai yếu tố.

Các yếu tố đầu tiên phải là một mảng (một số phiên bản của Perl đầu tiên tử có thể là một tài liệu tham khảo với một mảng, nhưng điều này sử dụng là không nên, chi tiết trong một phần dưới)

Sau lập luận thường giả hoặc mảng. Trong mảng đầu tiên cuộc tranh luận sẽ được thêm vào tất cả các yếu tố của sau lập luận.

Như lập luận bạn có thể xác định băm push(@arr, %hash). Trong mảng @arr sẽ được thêm vào tất cả các cặp giá trị quan trọng của băm (đó là các đặc thù mà thứ tự của các băm giá trị là không xác định và chạy khác nhau cùng chương trình có thể tạo ra các mảng yếu tố trong trình tự khác nhau). Nhưng thực sự sử dụng cuộc sống của băm như một chức năng tranh luận push() hiếm.

Nếu bạn không chỉ bất kỳ lập luận, nó sẽ lỗi:

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

Nếu bạn xác định một trong những cuộc tranh luận và lập luận này là một mảng push(@arr);, sau đó sẽ lỗi không được điều này không thay đổi các mảng, nhưng nếu các mã đã use warnings;, đó là lời cảnh báo:

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

Trở lại giá trị

Chức năng push() trở về số lượng các yếu tố đó là trong mảng sau thực hiện chức năng này.

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

Mã này là tương tự mã này:

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

Trở lại giá trị push() không cần phải rất thường xuyên. Rất thường sử dụng push(@arr, $value), và sự trở lại các giá trị đang bỏ qua.

Sử dụng ARRAYREF như số đầu tiên

Tiêu chuẩn bằng cách sử dụng push() — số đầu tiên là các mảng vào đó, các yếu tố được thêm vào từ tất cả các lập luận khác.

Nhưng trong danh ngôn ngữ Perl là một thử nghiệm. Nếu số đầu tiên là một loạt tài liệu tham khảo các chức năng push()bản thân đã dereferencing tài liệu tham khảo này và nói thêm dữ liệu cho các mảng.

Đây là mã.

▶ Run
#!/usr/bin/perl

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

my $arr = [];

push $arr, 1;

warn Dumper $arr;

Perl đến phiên bản 5.12 (bao gồm) của mã này ném lỗi:

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.

Bắt đầu với Perl 5.14 và 5.18 đến phiên bản (bao gồm) là mã thêm các mục trong ARRAYREF, và kết quả là:

$VAR1 = [
          1
        ];

Perl 5.20 và 5.22 cũng thêm một mục trong ARRAYREF, nhưng cũng đánh cảnh báo:

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

Và bắt đầu với phiên bản 5.24 của mã này cung cấp cho các lỗi:

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

Này, đặc tính của ngôn ngữ sử dụng là không nên. Nếu bạn cần thêm các mục trong ARRAYREF, tốt nhất là để viết rõ ràng push @{$arr}, 1; thay vào đó push $arr, 1;

Đây là mã có hoạt động giống nhau trên tất cả các phiên bản của Perl:

▶ Run
#!/usr/bin/perl

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

my $arr = [];

push @{$arr}, 1;

warn Dumper $arr;

Tài liệu chính thức

Đây là kết quả của sự chỉ huy 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)

Chủ đề liên quan

Các bài viết khác