ProgramaciónProgramador Perl/Desarrollador Backend

¿Cómo funcionan los contextos en Perl (escalares, de lista y void)? Proporcione ejemplos donde la elección del contexto afecta el comportamiento del código.

Supere entrevistas con el asistente de IA Hintsage

Respuesta

En Perl hay contextos que afectan el comportamiento de los operadores y funciones:

  • Escalar (scalar) — la expresión se evalúa como un solo valor.
  • De lista (list) — la expresión se evalúa como una lista de valores.
  • Void — el resultado no se utiliza.

Las funciones y operadores pueden devolver diferentes resultados dependiendo del contexto.

Ejemplos:

my @arr = (1, 2, 3); my $count = @arr; # contexto escalar: $count = 3 my @copy = @arr; # contexto de lista: se copia todo el array my $line = <STDIN>; # lee una línea (escalar) my @lines = <STDIN>; # lee todas las líneas (de lista)

El contexto se puede establecer explícitamente a través de la función scalar():

my $last_idx = scalar @arr; # contexto escalar forzado

Pregunta trampa

¿Qué valor devolverá la función keys %hash en contexto escalar?

Respuesta: Devolverá el número de elementos en el hash, y no una lista de claves como en el contexto de lista.

my %h = (a=>1, b=>2); my $num = keys %h; # $num = 2 my @keys = keys %h; # @keys = ('a', 'b')

Ejemplos de errores reales por desconocer los matices del tema


Historia

En un proyecto se contaba el número de elementos de un array:

my @items = get_items(); my $cnt = @items;

Más tarde alguien decidió asignar $cnt = get_items();, sin entender que la función devuelve una lista — ahora siempre se obtenía solo un valor (el primero) devuelto, y no la cantidad de elementos.


Historia

Al leer líneas de un archivo:

my $lines = <FILE>;

Esperando obtener todo el archivo, solo se obtuvo la primera línea — no se tuvo en cuenta que en contexto escalar se devuelve una única línea.


Historia

El desarrollador llamó a la función en contexto void, sin utilizar el valor devuelto:

open_my_file(); # la función devuelve un descriptor, pero no se guardó

Esto complicó la depuración — la función funcionaba, pero el archivo no se guardaba en ningún lugar, y no se capturaron los errores.