Lo que tu dices que necesitas es
splice().
Pero, ¡ojo!. ¡El tamaño del array cambia!
Eso quiere decir que si estás haciendo un bucle usando los índices para referenciar a los elementos, al eliminar un elemento intermedio hay que tener en cuenta que el índice ya no apunta al actual elemento, sino a uno nuevo.
Ejemplo. El siguiente programa
Using perl Syntax Highlighting
#!/usr/bin/perl
@palabras = qw( raton perro vaca caballo gato aguila salmon
);
print "Inicio: @palabras\n";
for ($i = 0; $i < @palabras; $i++ ) {
print "analizando $palabras[$i]\n";
if ( $palabras[$i] !~ /a/ ) {
splice(@palabras, $i, 1
);
print " eliminando...\n";
}
}
print "Final: @palabras\n";Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
genera
- Código: Seleccionar todo
Inicio: raton perro vaca caballo gato aguila salmon
analizando raton
analizando perro
eliminando...
analizando caballo
analizando gato
analizando aguila
analizando salmon
Final: raton vaca caballo gato aguila salmon
Fíjate: al eliminar el perro, ¡nos saltamos a la vaca!. Es debido a que vamos incrementando $i de uno en uno, pero al eliminar un elemento intermedio, todos los elementos que le siguen, hasta el final, van ocupando su posición: la 'vaca' ahora ocupa la posición del 'perro'... al seguir el bucle e incrementar $i, ahora en vez de analizar a la 'vaca', nos encontramos con un caballo.
La solución es... un arcano de Perl llamado
redo:
Using perl Syntax Highlighting
#!/usr/bin/perl
@palabras = qw( raton perro vaca caballo gato aguila salmon
);
print "Inicio: @palabras\n";
for ($i = 0; $i < @palabras; $i++ ) {
print "analizando $palabras[$i]\n";
if ( $palabras[$i] !~ /a/ ) {
splice(@palabras, $i, 1
);
print " eliminando...\n";
redo;
}
}
print "Final: @palabras\n";Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Fíjate que es el mismo programa, pero añadimos un
redo dentro del
if. Su función es 'empezar de nuevo el bucle sin pasar por la condición ni por el incremento'. Vamos, que repetimos el bucle interno.
Al repetirlo, $i no ha sido incrementado, PERO como los elementos dentro del array se han movido, SÍ que está apuntando al siguiente elemento a analizar ('vaca'):
- Código: Seleccionar todo
Inicio: raton perro vaca caballo gato aguila salmon
analizando raton
analizando perro
eliminando...
analizando vaca
analizando caballo
analizando gato
analizando aguila
analizando salmon
Final: raton vaca caballo gato aguila salmon
De todas formas, hay otras formas de hacer lo que quieres: exactamente como lo que has dicho:
Con una expresión regular compruebo que la palabra NO tenga la letra a y si esto resulta verdadero elimina ese elemento del array
pero reescrito de otra forma...
Con una expresión regular me quedo con las palabras que SI tengan la letra a
Luego queda así:
Using perl Syntax Highlighting
@palabras = grep { /a/ } @palabras;Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4