为什么`$ v =()= split`返回1?

per*_*rfi 10 perl

perldoc 说"标量上下文中的列表赋值返回列表赋值右侧的元素数",但是当我尝试这段代码时:

perl -e '$_="aaaaa";print $v=(()=split //)'
Run Code Online (Sandbox Code Playgroud)

输出1让我感到困惑.(我期待的答案是5.)

任何人都能解释一下吗?

Ole*_*kov 15

根据split文件:

分配给列表时,如果省略LIMIT或为零,则Perl提供的LIMIT大于列表中变量的数量<...>

由于您指定了空列表,因此split只返回1个结果,这个结果数正好在您的变量中结束.


Ala*_*rry 8

split 它中有一些疯狂的超魔法,它可以让它知道它在左侧有一个列表的作业的右侧,并根据该列表中的项目数量调整其行为.

这被描述perlfunc为"避免不必要的工作",但是您发现由该优化引起的行为的可观察差异.

要查看发生了什么的证据,请通过Deparse运行脚本,如下所示:

perl -MO=Deparse -e '$_="aaaaa";print $v=(()=split //)'
Run Code Online (Sandbox Code Playgroud)

更新:我去寻找实现这个的代码,而不是我预期的那样.实际上,优化由赋值运算符(op.c:Perl_newASSIGNOP)执行.分裂对其背景知之甚少.