tipos recorrer print matrices funciones datos array perl list scalar

recorrer - ¿Cuál es la diferencia entre los contextos escalar y de lista en Perl?



print array perl (3)

El contexto escalar es lo que obtienes cuando buscas un valor único. El contexto de la lista es lo que obtienes cuando buscas valores múltiples. Uno de los lugares más comunes para ver la distinción es cuando se trabaja con matrices:

@x = @array; # copy an array $x = @array; # get the number of elements in an array

Otros operadores y funciones también son sensibles al contexto:

$x = ''abc'' =~ /(/w+)/; # $x = 1 ($x) = ''abc'' =~ /(/w+)/; # $x = ''abc'' @x = localtime(); # (seconds, minutes, hours...) $x = localtime(); # ''Thu Dec 18 10:02:17 2008''

Cómo se comporta un operador (o función) en un contexto dado depende del operador. No hay reglas generales sobre cómo se supone que deben comportarse las cosas.

Puede hacer que sus propias subrutinas sean sensibles al contexto mediante el uso de la función wantarray para determinar el contexto de la llamada. Puede forzar que una expresión se evalúe en un contexto escalar utilizando la palabra clave scalar .

Además de los contextos escalares y de listas, también verá los contextos "vacío" (no se espera un valor de retorno) y "booleano" (un valor verdadero / falso esperado) mencionado en la documentación.

¿Cuál es la diferencia entre los contextos escalar y de lista en Perl y esto tiene algún paralelo en otros lenguajes como Java o Javascript?


Varios operadores en Perl son sensibles al contexto y producen resultados diferentes en el contexto de lista y escalar.

Por ejemplo:

my(@array) = (1, 2, 4, 8, 16); my($first) = @array; my(@copy1) = @array; my @copy2 = @array; my $count = @array; print "array: @array/n"; print "first: $first/n"; print "copy1: @copy1/n"; print "copy2: @copy2/n"; print "count: $count/n";

Salida:

array: 1 2 4 8 16 first: 1 copy1: 1 2 4 8 16 copy2: 1 2 4 8 16 count: 5

Ahora:

  • $first contiene 1 (el primer elemento de la matriz), porque los paréntesis en my($first) proporcionan un contexto de matriz, pero solo hay espacio para un valor en $first .
  • both @copy1 y @copy2 contienen una copia de @array ,
  • y $count contiene 5 porque es un contexto escalar, y @array evalúa la cantidad de elementos en la matriz en un contexto escalar.

También se podrían construir ejemplos más elaborados (los resultados son un ejercicio para el lector):

my($item1, $item2, @rest) = @array; my(@copy3, @copy4) = @array, @array;

No existe un paralelo directo con la lista y el contexto escalar en otros idiomas que conozco.


Esto simplemente significa que un tipo de datos se evaluará en función del modo de la operación. Por ejemplo, una asignación a un escalar significa que el lado derecho se evaluará como un escalar.

Creo que la mejor forma de entender el contexto es aprender sobre wantarray. Entonces imagine que = es una subrutina que implementa wantarray:

sub = { return if ( ! defined wantarray ); # void: just return (doesn''t make sense for =) return @_ if ( wantarray ); # list: return the array return $#_ + 1; # scalar: return the count of the @_ }

Los ejemplos de esta publicación funcionan como si se llamara a la subrutina anterior pasando el lado derecho como el parámetro.

En cuanto a los paralelos en otros idiomas, sí, sigo manteniendo que prácticamente todos los idiomas admiten algo similar. El polimorfismo es similar en todos los lenguajes OO. Otro ejemplo, Java convierte objetos a String en ciertos contextos. Y cada lenguaje de scripting sin tipo que he usado tiene conceptos similares.