To File :: Find это массив или просто скаляр? - PullRequest
0 голосов
/ 25 октября 2009

В этом фрагменте:

find( sub { 
        print "found " . $File::Find::name . "\n";
     }, ("."));

Какого типа будет (".")? Массив или скаляр?

Ответы [ 2 ]

7 голосов
/ 25 октября 2009

Давайте посмотрим на параметры для File::Find::find. В документации сказано:

find(\&wanted, @directories_to_search);

Давайте подумаем о функции find(), написанной так:

sub find
{
    my ($wanted, @directories_to_search) = @_;
    ...
}

Вам необходимо понять, что параметры, передаваемые в функцию, уже находятся в контексте списка (списка скаляров): это специальная переменная @_. Поэтому, когда вы вызываете find(), первый аргумент присваивается $wanted, который рассматривается как coderef (ссылка - это просто тип скаляра). Следующая назначаемая переменная - это массив. Когда вы присваиваете список массиву, массив становится «жадным» и принимает все значения из списка.

Поэтому, когда вы присваиваете @_ для ($wanted, @directories_to_search), а все остальные аргументы присваиваются @directories_to_search (массив скаляров).

Теперь вернемся к вашему коду. На самом высоком уровне вы звоните find(), передавая список, состоящий из двух терминов:

  1. анонимный код ссылки sub { ... }
  2. ".": строка длиной в один символ.

Вот так:

my ($wanted, @directories_to_search) = (sub { ... }, ".");

Итак, find() получает эти аргументы, как я описал выше: анонимный coderef является первым аргументом, а @directories_to_search поглощает остальные:

my $wanted = sub { ... };
my @directories_to_search = ".";

Я не совсем уверен, почему вы задаете вопрос (какого типа термин (".")), но вы можете позвонить на find(), как вы написали его выше, или вы можете удалить дополнительный набор скобок (они ничего не добавляют).

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