Funktion push() in Perl

In der Programmiersprache Perl gibt es die eingebaute Funktion push(). Mit dieser Funktion können Sie Elemente hinzufügen am Ende der Perl-array.

Hier ist ein Beispiel:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

my @arr = (1, 2);

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

print Dumper \@arr;

In diesem Programm wird ein array @arr mit zwei Elementen. Weiter mit der Funktion push() in diesem array Hinzugefügt noch 3 Elemente. undef, Zeile 'Hello' und die Anzahl der 8.

Das Ergebnis der Arbeit des Programms:

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

Argumente

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

Standard-Funktion verwenden push() — dies zu vermitteln ist es nicht mindestens zwei Elemente.

Das erste Element ist ein array (in einigen Versionen von Perl das erste Element kann noch eine Referenz auf ein array, ist aber die Verwendung wird nicht empfohlen, die Einzelheiten in einem anderen Abschnitt unten)

Die folgenden Argumente ist in der Regel Skalare oder Arrays. In das array aus dem ersten argument Hinzugefügt werden alle Elemente aus den folgenden Argumenten.

Als argument können Sie angeben Hash push(@arr, %hash). In ein array @arr Hinzugefügt werden alle Schlüssel-Wert-Paare aus dem Hash (hier gibt es die Besonderheit, dass die Ordnung der Hash-Werte undefiniert und verschiedene Neustart des gleichen Programms erstellen können die Elemente des Arrays in verschiedenen Reihenfolgen). Aber in wirklichen Leben die Verwendung von Hash als argument einer Funktion push() selten.

Wenn nicht angegeben kein argument, dann wird der Fehler:

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

Wenn Sie ein argument und dieses argument ein array push(@arr);, dann Fehler nicht, es ist nicht zu ändern array, aber wenn im Code gibt es use warnings;, dann wird die Warnung:

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

Der Rückgabewert

Funktion push() gibt die Anzahl der Elemente die sich im array nach die Ausführung dieser Funktion.

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

Dieser Code ähnelt dem hier solchen Code:

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

Der Rückgabewert push() müssen nicht sehr oft. Sehr oft wird push(@arr, $value), und der Rückgabewert der Wert wird ignoriert.

Die Verwendung von ARRAYREF als erstes argument

Standard-Funktion verwenden push() — das erste argument ist array zum hinzufügen der Elemente aus allen anderen Argumenten.

Aber in der Programmiersprache Perl war ein Experiment. In diesem Fall, wenn das erste argument ist eine Referenz auf ein array, gibt die Funktion push()- sama machte dereferenzieren diesen Link und fügt die Daten in ein array.

Hier ist der Code.

▶ Run
#!/usr/bin/perl

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

my $arr = [];

push $arr, 1;

warn Dumper $arr;

Perl auf Version 5.12 (inklusive) dieser Code erzeugt einen Fehler:

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.

Seit Version 5.14 und bis Version 5.18 (inklusive) ist ein Code Hinzugefügt Element in ARRAYREF und das Ergebnis war:

$VAR1 = [
          1
        ];

Perl 5.20 und 5.22 auch Hinzugefügt ein Element in ARRAYREF, aber zusammen mit diesem und noch gab Warnung:

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

Und ab der Version 5.24 dieser Code schon einen Fehler aus:

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

Diese Sprache fichey sein wird nicht empfohlen. Wenn Sie hinzufügen müssen Element in ARRAYREF, ist es am besten schreiben explizit push @{$arr}, 1; statt push $arr, 1;

Hier ist der Code, der identisch funktioniert auf allen Versionen von Perl:

▶ Run
#!/usr/bin/perl

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

my $arr = [];

push @{$arr}, 1;

warn Dumper $arr;

Die offizielle Dokumentation

Hier ist die Ausgabe des Befehls 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)

Verwandte Themen

Andere Artikel