En Perl hay contextos que afectan el comportamiento de los operadores y funciones:
scalar) — la expresión se evalúa como un solo valor.list) — la expresión se evalúa como una lista de valores.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
¿Qué valor devolverá la función
keys %hashen 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')
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.