Perl 什么决定了“split”的标量/列表上下文?
根据,goatse操作符Perl 什么决定了“split”的标量/列表上下文?,perl,split,Perl,Split,根据,goatse操作符=()=提供一个列表上下文,以便它可以计算其元素的数量。我以前也这么想。但是,当我不小心将操作符与拆分一起使用时,我注意到了一些奇怪的事情 下面的前两行是用effectiveperl编程,第二版编写的完全相同的语句。但事实上,split似乎改变了左侧的行为 my $wc; $wc = () = "foo:bar:buz" =~ m/(\w+)/g; # => 3 $wc = () = split /:/, "foo:bar:buz"; # => 1 $
=()=
提供一个列表上下文,以便它可以计算其元素的数量。我以前也这么想。但是,当我不小心将操作符与拆分一起使用时,我注意到了一些奇怪的事情
下面的前两行是用effectiveperl编程,第二版编写的完全相同的语句。但事实上,split
似乎改变了左侧的行为
my $wc;
$wc = () = "foo:bar:buz" =~ m/(\w+)/g; # => 3
$wc = () = split /:/, "foo:bar:buz"; # => 1
$wc = (undef) = split /:/, "foo:bar:buz"; # => 2
$wc = (undef, undef) = split /:/, "foo:bar:buz"; # => 3
$wc = (undef, undef, undef) = split /:/, "foo:bar:buz"; # => 3
有人能告诉我是什么导致返回值的变化吗?在下面的讨论限制的地方有记录:
分配给列表时,
若省略了限制(或零),则将限制视为
比列表中的变量数量大一个
这是一种优化,因此Perl不会创建它会立即丢弃的值。想象一下$varX
而不是undef
若要避免此优化,请将限制指定为-1:
$wc = () = split /:/, "foo:bar:buz", -1;
因为
若极限为负值,则视为相反
任意大;生产尽可能多的油田