根据perlsecret ,goatse 运算符 =()=
提供了一个列表上下文,以便它可以计算其元素的数量。我曾经也这么认为。但是当我不小心将运算符与 split
一起使用时,我注意到一些奇怪的事情。
下面的前两行与Effective Perl 编程,第二版
中编写的语句完全相同。但事实上,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
有人能告诉我是什么导致了返回值的变化吗?
最佳答案
它记录在split中下面讨论 LIMIT:
when assigning to a list, if LIMIT is omitted (or zero), then LIMIT is treated as though it were one larger than the number of variables in the list;
这是一种优化,因此 Perl 不会创建值,然后立即丢弃。想象一下 $varX
而不是 undef
。
要避免这种优化,请指定限制为 -1:
$wc = () = split /:/, "foo:bar:buz", -1;
因为
If LIMIT is negative, it is treated as if it were instead arbitrarily large; as many fields as possible are produced.
关于perl - 什么决定了 `split` 的标量/列表上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59827008/