Assim como acessar elementos individuais de um array, o Perl também provê diversos outros meios de lidar com os mesmos. Em particular, existem funções que tornam muito fácil o uso dos arrays do Perl como pilhas ou filas.
pop
A função pop
remove e retorna o último elemento de um array.
Neste primeiro exemplo, você pode ver como, dado um array de 3 elementos, a
função pop
remove o último elemento (aquele que possui maior índice)
e o retorna.
my @names = ('Foo', 'Bar', 'Baz');
my $last_one = pop @names;
print "$last_one\n"; # Baz
print "@names\n"; # Foo Bar
No caso especial do array original ser vazio, a função pop
retornará
undef.
push
A função push
pode adicionar um ou mais valores ao final do array.
(Bem, ela também pode adicionar 0 valor, mas isto não é lá muito útil, é?)
my @names = ('Foo', 'Bar');
push @names, 'Moo';
print "@names\n"; # Foo Bar Moo
my @others = ('Darth', 'Vader');
push @names, @others;
print "@names\n"; # Foo Bar Moo Darth Vader
Neste exemplo começamos com um array com dois elementos. Então empilhamos um único valor escalar no final do nosso array e ele acaba sendo extendido para um array de 3 elementos.
Na segunda chamada para push
, nós empilhamos o conteúdo do array
others
no final do array @names
, extendendo-o para um array
de 5 elementos.
shift
A função shift
move todo o array uma posição para a esquerda.
Considerando que o início do array está no lado esquerdo. O elemento que
estava no início do array vai "cair" fora do array e se tornar o valor
retornado pela função. (Se o array for vazio, shift retornará undef.)
Depois da operação, o array ficará um elemento menor.
my @names = ('Foo', 'Bar', 'Moo');
my $first = shift @names;
print "$first\n"; # Foo
print "@names\n"; # Bar Moo
Isto é muito parecido com o pop
, mas funciona na ponta de menor
índice.
unshift
É a operação contrária ao shift
. unshift
vai tomar um ou
mais valores (ou 0, se você preferir) e coloca-lo no início do array, movendo
todos os outros elementos para a direita.
Você pode passar a ele um único valor escalar, e então este valor passará a
ser o primeiro elemento do array. Ou, como no segundo exemplo, você pode
passar um segundo array e então os elementos deste segundo array
(@others
no nosso caso) será copiado no início do array principal
(@names
no nosso caso) movendo os outros elementos para índices
maiores.
my @names = ('Foo', 'Bar');
unshift @names, 'Moo';
print "@names\n"; # Moo Foo Bar
my @others = ('Darth', 'Vader');
unshift @names, @others;
print "@names\n"; # Darth Vader Moo Foo Bar