perl assignment-operator

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 o local

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