понимание этого поведения карты - PullRequest
5 голосов
/ 29 июня 2011

Я использую карту для извлечения первого элемента 2D-массива.Вот небольшой фрагмент кода.

my $array = [ [1,11,111], [2,22], undef, [4] ];

my @firstList = map { (defined $_) && $_->[0] } @$array;

Итак, я ожидаю, что карта вернет массив, содержащий элементы со значением undef или первый элемент элемента $ array.

, но результатэто не то, что я ожидаю.Для undef я получаю элемент типа 'scalar'.

Если я изменю оператор map следующим блоком, то получу ожидаемый результат.

my @firstList = map { $_->[0] } @$array;

Пожалуйста, помогите мне понятьоб этих двух операторах карты.

Ответы [ 2 ]

4 голосов
/ 29 июня 2011

Они оба возвращают результат последней выполненной операции.

Во-первых, когда он оценивает (defined $_) && $_->[0] для undef, он видит, что defined $_ имеет значение false, и останавливает обработку логического выражения. $_->[0] вообще не оценивается в этом случае. defined $_ была последней оцененной операцией, и ее результат был false, который, как я предполагаю, обозначен 0.

Во-вторых, это фактическое значение от дочернего элемента @$array, где оно получает значение undef.

0 голосов
/ 29 июня 2011
map { (defined $_) && $_->[0] }

фактически перебирает каждый элемент массива и применяет некоторую функцию или выражение. в нашем случае это следующая функция: defined($_) && $_->[0] если ваша ячейка не определена, третья ячейка в вашем массиве оценивается как defined(undef) && $->[0] (что равно '', вы можете попробовать это ..), а другая - 1 && $->[0], что равно $ -> [0].

Кстати, по этой же причине работает ваше второе утверждение: для каждой ячейки вашего массива вы выбираете первую внутреннюю ячейку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...