Что определяет скалярный / списочный контекст `split`? - PullRequest
2 голосов
/ 20 января 2020

Согласно perlsecret , оператор козла =()= предоставляет контекст списка, чтобы он мог подсчитать количество своих элементов. Я тоже так думал. Но когда я случайно использовал оператор вместе с split, я заметил кое-что странное.

Первые две строки следующего - это точно такие же утверждения, написанные в Effective Perl Programming, 2nd edition. Но на самом деле, кажется, 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

Может кто-нибудь сказать мне, что делает изменения возвращаемых значений?

1 Ответ

3 голосов
/ 20 января 2020

Это задокументировано в разделении далее, где обсуждается LIMIT:

при назначении списку, если LIMIT опущен (или ноль), тогда LIMIT обрабатывается как она была на единицу больше, чем число переменных в списке;

Это оптимизация, поэтому Perl не создает значений, которые бы сразу выбрасывались. Просто представьте $varX вместо undef.

Чтобы избежать этой оптимизации, укажите предел -1:

$wc = () = split /:/, "foo:bar:buz", -1;

, поскольку

Если LIMIT отрицательный, он обрабатывается так, как если бы он был произвольно большим; создается как можно больше полей.

...