Historia de la cuestión:
Los cortes (slices) son una poderosa característica de Perl que permite extraer o asignar un grupo de elementos de un arreglo o hash en una sola operación. El mecanismo de cortes existe desde casi las primeras versiones de Perl, soporta una sintaxis similar al lenguaje Python, pero tiene sus propias particularidades de ejecución y contexto.
Problema:
La principal dificultad con los cortes es distinguir entre los cortes-listas de arreglos y hashes, su contexto escalar/lista, los “matices” finos al asignar mediante un corte (especialmente si la asignación se hace a los mismos arreglos o hashes, o se utilizan índices repetidos). Un punto importante es que si se actualiza la estructura utilizando cortes, es fácil obtener un resultado no obvio debido a la expansión automática de la lista.
Solución:
Utiliza cortes de manera consciente. Si es necesario hacer una copia de datos, utiliza la clonación explícita de la lista. No permitas intersecciones al leer y escribir, y mantén un control claro sobre el contexto escalar/lista, si el corte se utiliza como argumento de función o elemento en una expresión.
Ejemplo de código:
my @array = (10, 20, 30, 40, 50); my @slice = @array[1, 3]; # (20, 40) @array[0, 2] = (100, 300); # @array ahora es (100, 20, 300, 40, 50) my %hash = (foo => 1, bar => 2, baz => 3); my @vals = @hash{"foo", "baz"}; # (1, 3)
Características clave:
Pregunta engañosa 1: ¿Se puede obtener un valor "escalar" del corte @array[2, 4] como $val = @array[2, 4]?
No, $val en este caso será igual al número de elementos (longitud de la lista), no al valor de un solo elemento. Es correcto acceder a elementos individuales exactamente a través de índices solitarios: $array[2].
Pregunta engañosa 2: Si hay índices repetidos en el corte, ¿qué se asigna?
Reasignación secuencial: se realiza la asignación para cada índice de izquierda a derecha, el último gana. Por ejemplo:
@array[0,0] = (1,2); # $array[0] == 2
Pregunta engañosa 3: ¿Se pueden asignar cortes con diferente número de elementos a la derecha y a la izquierda?
Sí, si hay menos a la derecha, los restantes recibirán undef. Si hay más, los extras son ignorados. Por lo general, esto es una fuente de errores difíciles de detectar.
Un desarrollador asigna valores: @array[2, 3] = ("foo");
Esperaba que ambos elementos recibieran "foo", pero $array[3] se volvió undef.
Ventajas:
Desventajas:
Utiliza la función map para mapear valores: @array[2, 3] = map { "foo" } (2, 3);
Ventajas:
Desventajas: