La función de push() en Perl

En el lenguaje de programación Perl tiene integrada la función de push(). Con esta función, puede añadir elementos al final de Perl de la matriz.

He aquí un ejemplo:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

my @arr = (1, 2);

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

print Dumper \@arr;

En este programa se define una matriz de @arr con dos elementos. Continuar con la función de push() en conjunto suman otros 3 elementos. undef, la cadena de 'Hello' y el número de 8.

El resultado del trabajo de este programa:

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

Los argumentos

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

Uso estándar de la función de push() es transmitir en ella no menos de dos elementos.

El primer elemento debe ser una matriz (en algunas versiones de Perl el primer elemento puede ser una referencia a la matriz, pero tal el uso no se recomienda, el detalle en otra sección de abajo)

Los siguientes argumentos son generalmente скаляры o matrices. En la matriz de la primera el argumento se agregarán todos los elementos de los siguientes argumentos.

Como argumento se puede indicar el hash push(@arr, %hash). En la matriz de @arr se agregarán todos los pares clave-valor de hash (aquí tiene la función de que el orden de los valores hash de incertidumbre y diferentes ejecuciones de un mismo programa puede crear los elementos de la matriz en diferentes secuencias). Pero en la vida real de uso de hash como argumento de la función push() rara vez se encuentra.

Si no se especifica ningún argumento, lo que se producirá un error:

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

Si se especifica un argumento, y este argumento es una matriz de push(@arr);, entonces no hay error, esto no cambiará la matriz, pero si en el código hay use warnings;, será una advertencia:

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

El valor devuelto

La función de push() devuelve el número de elementos que se convirtió en la matriz después de la ejecución de esta función.

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

Este código es similar a la que aquí esta el código:

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

El valor devuelto push() no muy a menudo. Muy a menudo se utiliza push(@arr, $value), y el valor devuelto se ignora el valor.

El uso de ARRAYREF como primer argumento

Uso estándar de la función de push() — el primer argumento es la matriz, en la que se agregan elementos de todos los demás argumentos.

Pero en el lenguaje de programación Perl fue el experimento. En caso de que el primer argumento es una referencia a una matriz, la función de push()sí hacía eliminar la referencia de este enlace y ha añadido los datos en una matriz.

Aquí está el código.

▶ Run
#!/usr/bin/perl

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

my $arr = [];

push $arr, 1;

warn Dumper $arr;

Perl a la versión 5.12 (ambos inclusive) en este código devuelve el siguiente error:

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 partir de la versión de Perl 5.14 y a la versión 5.18 (ambos inclusive) es el código de añadía el elemento en ARRAYREF y el resultado fue:

$VAR1 = [
          1
        ];

Perl 5.20 y 5.22 también añadía un elemento en ARRAYREF, pero junto con ello y daba advertencia:

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

Y a partir de la versión 5.24 este código devuelve el siguiente error:

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

Esta фичей de la lengua no se recomienda. Si necesita añadir el elemento en ARRAYREF, lo mejor es escribir explícitamente push @{$arr}, 1; en lugar de push $arr, 1;

Aquí está el código que trabaja de la misma forma en todas las versiones de Perl:

▶ Run
#!/usr/bin/perl

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

my $arr = [];

push @{$arr}, 1;

warn Dumper $arr;

La documentación oficial

He aquí el resultado 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)

Temas relacionados

Otros articulos