A função push() em Perl

Na linguagem de programação Perl possui a função de push(). Com esta função, você pode adicionar elementos ao final do Perl da matriz.

Aqui está um exemplo:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

my @arr = (1, 2);

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

print Dumper \@arr;

Este programa é definido matriz @arr com dois elementos. A seguir, utilizando a função de push() nesta matriz adicionam ainda 3 elementos. undef, linha 'Hello' e o número de 8.

O resultado da execução deste programa:

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

Argumentos

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

O padrão de uso da função push() — é transmitir não menos de dois itens.

O primeiro item deve ser uma matriz (em algumas versões do Perl o primeiro item ainda pode ser uma referência a uma matriz, mas é seu uso não é recomendado, detalhes em outra seção abaixo)

Os seguintes argumentos é, normalmente, escalares ou matrizes. Na matriz a partir do primeiro o argumento de ter adicionado todos os itens dos seguintes argumentos.

Como argumento, você pode especificar hash push(@arr, %hash). Em uma matriz de @arr são adicionados todos os pares chave-valor a partir do hash (aqui há uma característica que a ordem dos valores de hash indefinido e diferentes lançamentos de um mesmo programa podem criar os elementos de um array em ordens diferentes). Mas vida real, o uso de hash como argumento para a função push() é raro.

Se você não especificar nenhum argumento, então o erro será:

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

Se você especificar um argumento e o argumento de uma matriz de push(@arr);, o erro não será, isso não vai mudar da matriz, mas se o código tiver use warnings;, então vai um aviso:

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

O valor de retorno

A função push() retorna o número de elementos que se transformou em uma matriz, após a executar esta função.

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

Este código é semelhante ao aqui esta o código:

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

O valor de retorno push() precisa não é muito comum. É muito utilizado push(@arr, $value), e de retorno o valor é ignorado.

O uso de ARRAYREF como o primeiro argumento

O padrão de uso da função push() — o primeiro argumento é a matriz em que os elementos são adicionados a partir de todos os outros argumentos.

Mas em uma linguagem de programação Perl foi a experiência. No caso de o primeiro argumento é uma referência a uma matriz, então a função de push()- sama fez referência a este link e acrescentava os dados em uma matriz.

Aqui está o código.

▶ Run
#!/usr/bin/perl

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

my $arr = [];

push $arr, 1;

warn Dumper $arr;

Perl para a versão 5.12 (inclusive) este código gera um erro:

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 da versão Perl 5.14 e para a versão 5.18 (inclusive) é o código de adicionou o item em ARRAYREF e o resultado foi:

$VAR1 = [
          1
        ];

Perl 5.20 e 5.22 também adicionou um item no ARRAYREF, mas junto com isso ainda e deu aviso:

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

E a partir da versão 5.24 este código gera um erro:

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

Este фичей usar a linguagem não é recomendado. Se você precisa adicionar o item em ARRAYREF, o melhor é escrever explicitamente push @{$arr}, 1; em vez de push $arr, 1;

Aqui está o código que é semelhante funciona em todas as versões do Perl:

▶ Run
#!/usr/bin/perl

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

my $arr = [];

push @{$arr}, 1;

warn Dumper $arr;

A documentação oficial

Aqui está a saída do 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

Outros artigos