perl - Operador de asignación de escalas y listas
assignment-operator (1)
El símbolo
=
se compila en uno de los dos operadores de asignación:
-
Se utiliza un
operador de asignación de lista
si el lado izquierdo (LHS) de a
=
es algún tipo de agregado. - De lo contrario, se utiliza un operador de asignación escalar .
Se consideran agregados los siguientes:
-
Cualquier expresión entre paréntesis (ej.
(...)
) -
Una matriz (por ejemplo,
@array
) -
Un segmento de matriz (por ejemplo,
@array[...]
) -
Un hash (por ejemplo,
%hash
) -
Una porción de hash (por ejemplo,
@hash{...}
) -
Cualquiera de los anteriores precedido por
my
,our
olocal
Hay dos diferencias entre los operadores.
Contexto de los operandos
Los dos operadores difieren en el contexto en el que se evalúan sus operandos.
-
La asignación escalar evalúa sus dos operandos en el contexto escalar.
# @array evaluated in scalar context. my $count = @array;
-
La asignación de lista evalúa sus dos operandos en el contexto de lista.
# @array evaluated in list context. my @copy = @array;
# @array evaluated in list context. my ($first) = @array;
Valor (es) devuelto
Los dos operadores difieren en lo que devuelven.
-
La tarea escalar ...
-
... en contexto escalar evalúa a su LHS como un valor de l.
# The s/// operates on $copy. (my $copy = $str) =~ s/////////g;
-
... en el contexto de la lista evalúa a su LHS como un valor.
# Prints $x. print($x = $y);
-
-
La lista de tareas ...
-
... en el contexto escalar evalúa la cantidad de escalares devueltos por su RHS.
# Only dies if f() returns an empty list. # This does not die if f() returns a # false scalar like zero or undef. my ($x) = f() or die;
# $counts gets the number of scalars returns by f(). my $count = () = f();
-
... en el contexto de la lista evalúa los escalares devueltos por su LHS como valores l.
# Prints @x. print(@x = @y);
-
Por favor, ayúdame a entender los siguientes fragmentos:
-
my $count = @array;
-
my @copy = @array;
-
my ($first) = @array;
-
(my $copy = $str) =~ s/////////g;
-
my ($x) = f() or die;
-
my $count = () = f();
-
print($x = $y);
-
print(@x = @y);