Funktion push() i Perl

I programmeringssproget Perl har en indbygget funktion push(). Ved hjælp af denne funktion, du kan føje elementer til slutningen af Perl-array.

Her er et eksempel:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

my @arr = (1, 2);

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

print Dumper \@arr;

Dette program definerer et array @arr med to elementer. Så ved hjælp af funktionen push() i dette array tilføje yderligere 3 elementer. undef, linje 'Hello' , og antallet 8.

Output fra dette program:

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

Argumenter

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

Standard hjælp push() er at videregive det er ikke mindst to elementer.

Det første element skal være en array (nogle versioner af Perl det første element kan være en henvisning til et array, men denne brug ikke anbefales detaljer i andet afsnit nedenfor)

De følgende argumenter er normalt skalarer eller arrays. I den vifte af de første argumentet vil blive tilføjet til alle elementer af følgende argumenter.

Som argument, kan du angive hash push(@arr, %hash). I array @arr vil blive tilføjet alle de par nøgle-værdi af hash (er der den ejendommelighed, at den rækkefølge af hash-værdier er udefineret og forskellige kørsler af det samme program kan skabe array-elementer i forskellige sekvenser). Men det virkelige liv, brug af hash som en funktion argument push() sjælden.

Hvis du ikke angiver nogen argumenter, vil det fejl:

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

Hvis du angiver et argument, og dette argument er en matrix push(@arr);, så fejl ikke vil være dette ændrer ikke det array, men hvis koden har use warnings;, der er advarsel:

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

Return værdi

Funktion push() returnerer antallet af elementer, der var i den matrix, der efter du kan udføre denne funktion.

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

Denne kode svarer til denne kode:

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

Return værdi push() skal ikke meget ofte. Meget ofte brugt push(@arr, $value), og vende tilbage værdien ignoreres.

Brug ARRAYREF som det første argument

Standard hjælp push() — det første argument er den matrix, hvor elementerne er tilføjet fra alle de andre argumenter.

Men i programmeringssproget Perl var et eksperiment. Hvis det første argument er en matrix reference, funktion push()selv gjorde dereferere denne reference og tilføjet data til array.

Her er den kode.

▶ Run
#!/usr/bin/perl

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

my $arr = [];

push $arr, 1;

warn Dumper $arr;

Perl til version 5.12 (inklusiv) af denne kode kaster fejlen:

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.

Start med Perl 5.14 og 5.18 til version (inklusiv) er koden tilføjet det element i ARRAYREF, og resultatet blev:

$VAR1 = [
          1
        ];

Perl 5.20 og 5.22 også tilføjet et element i ARRAYREF, men også gav advarsel:

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

Og fra og med version 5.24 af denne kode giver fejl:

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

Denne funktion af sprog brug anbefales ikke. Hvis du har brug for at tilføje det element i ARRAYREF, det er bedst at skrive klart push @{$arr}, 1; i stedet push $arr, 1;

Her er den kode, der virker ens på alle versioner af Perl:

▶ Run
#!/usr/bin/perl

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

my $arr = [];

push @{$arr}, 1;

warn Dumper $arr;

Officiel dokumentation

Her er outputtet af kommandoen 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)

Relaterede emner

Andre artikler