Как мне сделать подпрограмму, которая принимает массив * или * переменное число скаляров? - PullRequest
5 голосов
/ 11 марта 2011

Я ищу подпрограмму mysub, которая должна вести себя так, чтобы следующие два вызова были практически одинаковыми.

mysub(["values", "in", "a", "list"]);
mysub("Passing", "scalar", "values");

Каков правильный синтаксис, чтобы это произошло?

1 Ответ

18 голосов
/ 11 марта 2011

Проверьте, содержит ли @_ ссылку на один массив.

sub mysub {
    if ( @_ == 1 && ref( $_[0] ) eq 'ARRAY' ) {
        # Single array ref
    } else {
        # A list
    }
}

Предложение if проверяет, что передан только один аргумент, и является ли аргумент ссылкой на массив, используя ref.Чтобы убедиться, что случаи одинаковы:

sub mysub {
    if ( @_ == 1 && ref( $_[0] ) eq 'ARRAY' ) {
        @_ = @{ $_[0] };
    }
    # Rest of the code
}
...