在Perl中,通过列表赋值计算单词是如何工作的?

在Perl中,通过列表赋值计算单词是如何工作的?,perl,initialization,scalar-context,Perl,Initialization,Scalar Context,我无法确切理解以下代码段的工作原理: my$str='abc def ghi'; 我的$num=()=$str=~/\w+/g; 说$num;#打印字数,3 我知道$str=~/\w+/g返回一个单词列表,显然,该列表会传递给最左边的赋值。然后,$num在该列表上施加标量上下文并变为3 但是()=('abc','def','ghi')是什么意思?是不是有点像my$a=my@b=(3,5,8)?如果是这样,最右边的列表如何转移到最左边的$num?每个perl操作符在列表和标量上下文中都有特定的行

我无法确切理解以下代码段的工作原理:

my$str='abc def ghi';
我的$num=()=$str=~/\w+/g;
说$num;#打印字数,3
我知道
$str=~/\w+/g
返回一个单词列表,显然,该列表会传递给最左边的赋值。然后,
$num
在该列表上施加标量上下文并变为3


但是
()=('abc','def','ghi')
是什么意思?是不是有点像
my$a=my@b=(3,5,8)
?如果是这样,最右边的列表如何转移到最左边的
$num

每个perl操作符在列表和标量上下文中都有特定的行为。运算符为其操作数提供上下文,但从其作为操作数的对象接收上下文。 在标量上下文中放置列表赋值时,它返回赋值右侧的元素数。这将启用以下代码:

while (my @pair = splice(@array, 0, 1)) {
处理
=()=
的方式没有什么特别之处;你也可以做
=($dummy)=
=(@dummy)=
;关键的部分是,您希望匹配是列表上下文(生成所有可能的匹配),然后只获取它们的计数


因此,您可以执行列表赋值(每当左操作数是圆括号表达式或数组或切片时,
=
就是这样做的),但由于您实际上并不需要这些值,因此可以使用空列表。然后将其放在标量上下文中;在本例中,使用列表赋值作为标量赋值的正确操作数。

现在开始学习Perl的人越来越少,原因之一是它有一些像您的示例那样的模糊代码。 检查土星的perlsecret页面

=()=

(另一个昵称:“土星”)

如果你不理解这个操作员的名字,就认为自己是幸运的。建议您不要在互联网上搜索视觉解释

goatse操作符在其右侧提供一个列表上下文,并在其左侧返回元素数。注意,左侧必须提供标量上下文;显然,左侧的列表上下文将在中间接收空列表。


解释是,标量上下文中的列表赋值返回赋值右侧的元素数,而不管这些元素中有多少实际分配给了变量。在这种情况下,右侧的所有元素都被简单地分配到一个空列表中(因此被丢弃)。

警告:在搜索了goatse这个词的含义后,我感觉很糟糕,我不建议也搜索它以获得直观的解释……请看,您已经得到了答案,但我将对特定方面进行评论。“是不是有点像……”是的,就是这样。(在没有my的情况下,它可以按原样工作)。至于“如何将末尾的列表转移到…”——在Perl表达式中也返回值
$v1=$v2
返回
$v1
,因此可以进一步分配(链接)。因此,在您的示例中,
@b
将返回其列表。。。然后将其赋值给标量,生成其长度(大小)。(我们从右到左跟踪执行,所以我发现“结束”和“开始”有误导性。)你说得对@zdim,我更新了副本以澄清这一点。感谢@ikegami为我指出这个问题。这正是我的问题的一般化版本,但我找不到将我带到那里的搜索关键字。更正我上面所说的(“按现状工作,而不使用
my
”):您的示例按现状工作——所有
my
s也按现状工作:
perl-wE'my$n=my@ary=(3,5,8);说$n'
Nevermind,您扩展的部分或多或少包含了我试图添加的内容。@choroba总是建议改进appreciated@TolgaKurtsplit接受第三个参数,该参数告诉它要拆分多少个字段,在()=赋值中,该参数默认为比被赋值的内容数多一个字段。do
my$num=()=split/\s+/,'abc def ghi',-1使其拆分为无限数量的fields@TolgaKurt0与未指定它相同。perldoc说,“在时间关键型应用程序中,避免拆分为超出必要范围的字段是值得的。因此,当分配给列表时,如果省略了限制(或零),则限制将被视为比列表中变量数量大一个”。您必须指定-1(或任何负数,或只是一个非常大的数字)才能获取所有字段。这是一个奇怪的地方,split(在编译时)会伸出手来查看它是如何以一种不寻常的方式被调用的