Funzione push() in Perl

Nel linguaggio di programmazione Perl ci sono built-in funzione di push(). Con questa funzione è possibile aggiungere elementi al fine Perl matrice.

Ecco un esempio:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

my @arr = (1, 2);

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

print Dumper \@arr;

In questo programma definisce una matrice @arr con due elementi. Avanti con la funzione push() in questa matrice si aggiungono altri 3 elementi. undef, riga 'Hello' e il numero di 8.

Il risultato del lavoro di questo programma:

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

Argomenti

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

L'uso standard di funzioni push() — è quello di trasmettere a lei non meno di due elementi.

Il primo elemento deve essere una matrice (in alcune versioni di Perl il primo elemento può ancora essere un riferimento a un array, ma cos'è l'uso non è raccomandato, i dettagli in un'altra sezione qui sotto)

I seguenti argomenti sono, di solito scalari o matrici. In una matrice di primo argomento verranno aggiunti tutti gli elementi dei seguenti argomenti.

Come argomento è possibile specificare hash push(@arr, %hash). In una matrice @arr saranno aggiunte tutte le coppie chiave-valore di hash (qui c'è una caratteristica che l'ordine dei valori hash indeterminato e diverse esecuzioni dello stesso programma può creare gli elementi di un array in diverse sequenze). Ma in vita reale utilizzo di hash come argomento della funzione push() è rara.

Se non si specifica alcun argomento, quello è un errore:

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

Se si specifica un argomento un array di push(@arr);, allora l'errore non sarà, questo non cambierà la matrice, ma se nel codice ci sono use warnings;, quello è un avviso:

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

Il valore restituito

Funzione push() restituisce il numero di elementi che è diventato in un array dopo l'esecuzione di questa funzione.

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

Questo codice è simile ecco questo codice:

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

Il valore restituito push() è necessario non molto spesso. Molto spesso viene utilizzato push(@arr, $value), e restituito il valore viene ignorato.

L'uso di ARRAYREF come primo argomento

L'uso standard di funzioni push() — il primo argomento è una matrice in cui vengono aggiunti gli elementi di tutti gli altri argomenti.

Ma nel linguaggio di programmazione Perl è stato un esperimento. Nel caso in cui il primo argomento è un riferimento a un array, la funzione push()di per sé fatto dereferenziazione questo link e aggiunto i dati in un array.

Ecco il codice.

▶ Run
#!/usr/bin/perl

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

my $arr = [];

push $arr, 1;

warn Dumper $arr;

Perl alla versione 5.12 (compreso) in questo codice genera un errore:

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.

A partire dalla versione di Perl 5.14 e alla versione 5.18 (compreso) è il codice aggiunto l'elemento in ARRAYREF e il risultato è stato:

$VAR1 = [
          1
        ];

Perl 5.20 e 5.22 anche aggiunto un elemento in ARRAYREF, ma insieme a questo, un altro e ha dato avviso:

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

E a partire dalla versione 5.24 questo codice è già dà un errore:

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

Questa swift linguaggio non è consigliata. Se avete bisogno di aggiungere l'elemento in ARRAYREF, è meglio scrivere chiaramente push @{$arr}, 1; invece push $arr, 1;

Ecco il codice, che funziona allo stesso modo su tutte le versioni di Perl:

▶ Run
#!/usr/bin/perl

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

my $arr = [];

push @{$arr}, 1;

warn Dumper $arr;

La documentazione ufficiale di

Ecco l'output del comando 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)

Temi correlati

Altri articoli