Jacob Champion <jacob.champ...@enterprisedb.com> writes: > On Fri, Aug 8, 2025 at 1:07 PM Dagfinn Ilmari Mannsåker > <ilm...@ilmari.org> wrote: >> $ perl -MJSON::PP=encode_json -E 'say encode_json([1, 2, 3])' >> [1,2,3] >> >> $ perl -MJSON::PP=encode_json -E 'say encode_json([1 => (2, 3)])' >> [1,2,3] > > I swear, this language. > > But: > > $ perl -MJSON::PP=encode_json -E 'say encode_json(1,2)' > Too many arguments for JSON::PP::encode_json at -e line 1, near "2) > $ perl -MJSON::PP=encode_json -E 'say encode_json((1,2))' > 2 > > So what's going on there? (Google is not very helpful for these sorts > of Perl problems; I don't even know how to describe this.)
That's because encode_json has a prototype[1], which changes how the argument list is parsed: no longer just as a flat list of values like a normal function. Specifically, it has a prototype of '$', which means it only takes one argument, which is evaluated in scalar context. So the first example is a syntax error, but in the second example the parenthesised expression is the single argument. Becuse it's in scalar context, the comma is actually the scalar comma operator, not the list element separator, so the return value is the right-hand side of the comma (just like in C), not the length of the would-be list. Onfusingly, they are both 2 here (which is why 1,2,3,... are bad values to use when exploring presedence/context issues in Perl, sorry for doing that in my example). More clearly (fsvo): $ perl -MJSON::PP=encode_json -E 'say encode_json((11,12))' 12 - ilmari [1] https://perldoc.perl.org/perlsub#Prototypes