Почему карта возвращает пустой массив? - PullRequest
3 голосов
/ 21 июля 2009

У меня есть проблема в Perl, я не понимаю. Я сократил его до этого очень короткого кода.

Почему функция Perl map возвращает пустой массив? Разве он не должен возвращать массив с 9 undef с?

sub mySub{
    return;
}

my @arr = (1 .. 9);
my @arr2 = map( mySub($_), @arr );

print @arr . ' ' . @arr2, "\n";

Он печатает "9 0".

Возможно, это что-то простое, но perldoc не помогает.

Ответы [ 3 ]

8 голосов
/ 21 июля 2009

Более общий ответ на ваш вопрос таков: когда return используется без аргумента, возвращаемое значение зависит от контекста вызова:

list context    returns an empty list
scalar context  returns an undefined value

Например:

use strict;
use warnings;
use Data::Dumper;

my (@list);
sub mySub { return }
@list = map(       mySub($_), 1..2); print Dumper(\@list);
@list = map(scalar mySub($_), 1..2); print Dumper(\@list);

Выход:

$VAR1 = [];
$VAR1 = [
          undef,
          undef
        ];
7 голосов
/ 21 июля 2009

Ваша подпрограмма не возвращает undef, она возвращает пустой список. 9 раз и пустой список все еще пустой список.

Попробуйте явно вернуть undef, и результат будет другим.

3 голосов
/ 21 июля 2009

Попробуйте это

use strict;
use warnings;

sub mySub{
    return undef;
}

my @arr = (1,2,3,4,5,6,7,8,9);
my @arr2 = map(&mySub, @arr);

print @arr." ".@arr2;

Если вам нужно получить список, содержащий undefs, вам нужно явно вернуть undef. Дело в том, что map вызывает ваш mySub в контексте массива (проверьте, что из этого подпрограммы вы хотите получить из wantarray) оператор return по существу возвращает пустой список каждый раз, когда вызывается ваша подпрограмма, что в итоге приводит к пустому массиву

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