ProgramaciónDesarrollador Backend

¿Cómo funcionan las operaciones de lista map y grep en Perl? ¿Cuáles son sus diferencias y cómo evitar efectos secundarios inesperados al usarlas?

Supere entrevistas con el asistente de IA Hintsage

Respuesta

map y grep son poderosas funciones de Perl para trabajar con arreglos:

  • map aplica una expresión a cada elemento de la lista y devuelve una nueva lista con los resultados.
  • grep devuelve los elementos de la lista para los cuales la expresión devuelve un valor verdadero (filtrado).

Ejemplo de uso:

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)

Importante

  • Ámbito: Dentro de los bloques de 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).
  • Valores devueltos: map siempre devuelve una lista, grep - un subconjunto de la lista original.

Pregunta con trampa

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).

Ejemplo:

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

Ejemplos de errores reales debido a desconocer los matices del tema


Historia En un proyecto, un desarrollador esperaba que después de map { $_++ } @array, el propio arreglo @array se 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 map anidados 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 el map interno sobrescribió los valores en el arreglo resultante.