map y grep son poderosas funciones de Perl para trabajar con arreglos:
my @nums = (1, 2, 3, 4, 5, 6); my @squared = map { $_ * $_ } @nums; # (1, 4, 9, 16, 25, 36) my @even = grep { $_ % 2 == 0 } @nums; # (2, 4, 6)
map y grep, la variable $_ contiene por defecto el elemento actual. Modificar $_ cambiará el propio elemento del arreglo original si el arreglo se pasa por referencia o si se usa explícitamente $_ (por ejemplo, mediante alias a través de foreach).map siempre devuelve una lista, grep - un subconjunto de la lista original.Pregunta: ¿Qué hace el siguiente código y por qué?
my @nums = (1..5); my @result = map { $_++ } @nums; print "@nums ";
Respuesta: Este código no cambiará el arreglo original @nums. El operador $_++ incrementa el valor de la variable dentro del bloque, pero no guarda estos cambios en el arreglo original, ya que map devuelve el valor modificado, pero el arreglo original no se ve afectado (a menos que se use alias a través de foreach).
my @nums = (1..5); my @result = map { $_++ } @nums; # @result será (1,2,3,4,5), @nums no cambia print "@nums "; # Imprimirá: 1 2 3 4 5
Historia En un proyecto, un desarrollador esperaba que después de
map { $_++ } @array, el propio arreglo@arrayse modificara. Como resultado, el programa continuó trabajando con los viejos valores, lo que llevó a cálculos incorrectos durante la agregación de datos.
Historia En un sistema de informes, al filtrar un arreglo a través de
grep, dentro del bloque se utilizó accidentalmente el comando de asignación$result = $_, lo que provocó que todos los elementos se sobrescribieran en la misma variable, perdiendo la fuente de datos. Esto complicó la depuración y resultó en pérdidas en la reportística.
Historia En un script de integración, se aplicaron
mapanidados y se olvidó que el contexto interno también trabaja con la variable común$_, lo que causó un comportamiento impredecible al modificar elementos, ya que elmapinterno sobrescribió los valores en el arreglo resultante.