Давайте посмотрим на параметры для 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()
, передавая список, состоящий из двух терминов:
- анонимный код ссылки
sub { ... }
"."
: строка длиной в один символ.
Вот так:
my ($wanted, @directories_to_search) = (sub { ... }, ".");
Итак, find()
получает эти аргументы, как я описал выше: анонимный coderef является первым аргументом, а @directories_to_search
поглощает остальные:
my $wanted = sub { ... };
my @directories_to_search = ".";
Я не совсем уверен, почему вы задаете вопрос (какого типа термин (".")
), но вы можете позвонить на find()
, как вы написали его выше, или вы можете удалить дополнительный набор скобок (они ничего не добавляют).