Почему map() маскирует ошибку "undefined"?

Мне интересно, почему вызов map во втором фрагменте пропускает ошибку 'undefined'?

use strict;
use warnings;
my $x;
my @a = @{ $x }; # error: Can't use an undefined value as an ARRAY reference

Сравнить с:

use strict;
use warnings;
my $x;
my @a = map $_, @{ $x }; # no error, @a is empty

Ответы

Ответ 1

Это связано с тем, что map() делает сглаживание (по существу, используя цикл for()). Что происходит, так это то, что isf используется в контексте l-value и, следовательно, становится авто-vivified.

В вашем предыдущем примере вы пытаетесь использовать isf непосредственно в контексте r-значения, поэтому он генерирует ошибку (потому что не происходит автоматическое оживление).

Вы можете упростить свой тест, чтобы использовать for(), и получите тот же результат, что и с map():

use warnings;
use strict;

my $x;

for (@{ $x }){
    print "$_\n";
}

... нет вывода.

Чтобы визуально увидеть, что $x был автоматически оживлен как ссылка на массив, вы можете использовать функцию ref():

my $x;
my @a = map $_, @{ $x };

print ref $x;

Вывод:

ARRAY