Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 什么决定了“split”的标量/列表上下文?_Perl_Split - Fatal编程技术网

Perl 什么决定了“split”的标量/列表上下文?

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 $

根据,goatse操作符
=()=
提供一个列表上下文,以便它可以计算其元素的数量。我以前也这么想。但是,当我不小心将操作符与
拆分一起使用时,我注意到了一些奇怪的事情

下面的前两行是用
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;
因为

若极限为负值,则视为相反 任意大;生产尽可能多的油田