Splice para fatiar e picar arrays em Perl
Depois de aprender sobre pop, push, shift, and unshift, estudantes às vezes me perguntam como remover um elemento do meio de um array.
Eu geralmente não tenho tempo para explicar isto. Existem outras coisas a ensina-los, que parecem ser mais importantes que splice() no tempo limitado que temos, mas geralmente eu ao menos aponto-lhes a direção correta.
Desta vez isto será muito mais fácil dado que você, o(a) leitor(a), pode decidir se gostaria de investir seu tempo extra.
Como remover um elemento do meio de um array em Perl?
my @dwarfs = qw(Doc Grumpy Happy Sleepy Sneezy Dopey Bashful); splice @dwarfs, 3, 2; print "@dwarfs"; # Doc Grumpy Happy Dopey Bashful
Como você pode ver o 4o e 5o elementos do array foram removidos. Isto ocorre porque o segundo parâmetro do splice é o offset do primeiro elemento a ser removido, e o terceiro parâmetro é o número de elementos a ser removido.
Como inserir um elemento no meio de um array em Perl?
my @dwarfs = qw(Doc Grumpy Happy Sleepy Sneezy Dopey Bashful); splice @dwarfs, 3, 0, 'SnowWhite'; print "@dwarfs"; # Doc Grumpy Happy SnowWhite Sleepy Sneezy Dopey Bashful
Nesse caso nós usamos splice para inserir um elemento. Normalmente o segundo parâmetro (o offset) define onde inicia a remoção de elementos, mas neste caso o terceiro parâmetro - o número de elementos - foi 0 então splice não removeu nenhum elemento. Em vez disso, o offset é usado como a posição para inserir algo novo: o valor passado como 4o parâmetro para splice.
Assim é como SnowWhite terminou entre os sete anões.
Como inserir uma lista de valores em um array em Perl?
Inserir um elemento é na verdade apenas um caso especial de inserção de vários elementos.
my @dwarfs = qw(Doc Grumpy Happy Sleepy Sneezy Dopey Bashful); splice @dwarfs, 3, 0, 'SnowWhite', 'Humbert'; print "@dwarfs"; # Doc Grumpy Happy SnowWhite Humbert Sleepy Sneezy Dopey Bashful
Neste caso depois do 3o parâmetro temos vários valores (2 neste caso). Eles são todos inseridos no array.
Como inserir um array no meio de outro array em Perl?
O mesmo aconteceria se passássemos um array como o 4o parâmetro:
my @others = qw(SnowWhite Humbert); my @dwarfs = qw(Doc Grumpy Happy Sleepy Sneezy Dopey Bashful); splice @dwarfs, 3, 0, @others; print "@dwarfs";
Substituir parte de um array com alguns outros valores
Você pode também adicionar e remover elementos em um único comando:
my @others = qw(SnowWhite Humbert); my @dwarfs = qw(Doc Grumpy Happy Sleepy Sneezy Dopey Bashful); splice @dwarfs, 2, 4, @others; print "@dwarfs\n"; # Doc Grumpy SnowWhite Humbert Bashful
Neste caso nós removemos quatro dos anões e os substituimos por duas pessoas de tamanho natural: SnowWhite e Humbert o Caçador.
splice
Splice é a função definitiva para modificar arrays em Perl. Você pode remover qualquer seção de um array e substitui-la por qualquer outra lista de valores. O número de elementos removidos pode ser diferente, e qualquer um deles pode ser 0 também.
A sintaxe padrão da função tem os seguintes parâmetros, apesar de todas as partes (bem, exceto pelo array propriamente dito) são opcionais:
splice ARRAY, OFFSET, LENGTH, LIST
OFFSET e LENGTH definem a seção no ARRAY que será removida. Ambos são (números) inteiros. LIST é uma lista de valores que será inserida no lugar da seção que foi removida. Se LIST não é fornecida, ou é vazia, então splice vai apenas remover itens mas não vai inserir nenhum.
Valores de Retorno
Dentro do contexto LIST splice retorna os elementos removidos do array.
my @others = qw(SnowWhite Humbert); my @dwarfs = qw(Doc Grumpy Happy Sleepy Sneezy Dopey Bashful); my @who = splice @dwarfs, 3, 2, @others; print "@who\n"; # Sleepy Sneezy
Dentro do contexto SCALAR, splice retorna o último elemento removido, ou undef caso nenhum elemento tenha sido removido.
my @others = qw(SnowWhite Humbert); my @dwarfs = qw(Doc Grumpy Happy Sleepy Sneezy Dopey Bashful); my $who = splice @dwarfs, 3, 2, @others; print "$who\n"; # Sneezy
Parâmetros Negativos
Ambos offset e length podem ser números negativos. Em cada caso, isso significa "conte a partir do final do array".
my @dwarfs = qw(Doc Grumpy Happy Sleepy Sneezy Dopey Bashful); my @who = splice @dwarfs, 3, -1; print "@who"; # Sleepy Sneezy Dopey
Isso significa, deixe 3 intactos e então remova (e retorne) todos os elementos até 1 antes do fim.
my @dwarfs = qw(Doc Grumpy Happy Sleepy Sneezy Dopey Bashful); my @who = splice @dwarfs, -3, 1; print "@who"; # Sneezy
Isso significa: "Conte 3 a partir do final e remova (e retorne) 1 elemento iniciando deste ponto.
Conclusão
Espero que ao menos parte disto lhe ajude a entender melhor como splice opera arrays em Perl.
Published on 2013-04-30