Why does the goatse operator work?

前端 未结 3 842
一向
一向 2021-01-04 19:43

The difference between arrays and lists and between list and scalar context have been discussed in the Perl community quite a bit this last year (and every year, really). I

3条回答
  •  时光说笑
    2021-01-04 19:58

    It helps to remember that in Perl, assignment is an expression, and that you should be thinking about the value of the expression (the value of the assignment operator), not "the value of a list".

    The value of the expression qw(a b) is ('a', 'b') in list context and 'b' in scalar context, but the value of the expression (() = qw(a b)) is () in list context and 2 in scalar context. The values of (@a = qw(a b)) follow the same pattern. This is because pp_aassign, the list assignment operator, chooses to return a count in scalar context:

    else if (gimme == G_SCALAR) {
        dTARGET;
        SP = firstrelem;
        SETi(lastrelem - firstrelem + 1);
    }
    

    (pp_hot.c line 1257; line numbers are subject to change, but it's near the end of PP(pp_aassign).)

    Then, apart from the value of the assignment operator is the side-effect of the assignment operator. The side-effect of list assignment is to copy values from its right side to its left side. If the right side runs out of values first, the remaining elements of the left side get undef; if the left side runs out of values first, the remaining elements of the right side aren't copied. When given a LHS of (), the list assignment doesn't copy anything anywhere at all. But the value of the assignment itself is still the number of elements in the RHS, as shown by the code snippet.

提交回复
热议问题