grep
примет список, переданный ему (в этом случае каждый элемент, видимый в любом из хеш-ссылок); и возвращает список только тех элементов, для которых выражение в блоке имеет значение true (локально устанавливая переменную $_
для каждого элемента в списке).
Давайте посмотрим, как оценивается это выражение:
@_
- это массив всех параметров, переданных подпрограмме - в нашем случае это список хеш-ссылок, переданных в.
В $seen{$_} == @_
выражении этот список принудительно помещается в скалярный контекст (из-за ==
).
При использовании в скалярном контексте список оценивается как количество элементов в списке - в приведенном выше примере вызов равен 3, поскольку в него передано 3 хеш-значения.
Итак, для каждого ключа в %seen
(например, каждый ключ, видимый в любом из N хэш-ссылок); выражение $seen{$_} == @_
численно сравнивает число раз, которое элемент был замечен в хешах, с общим количеством хешей - конечно, оно будет равным, только если элемент находится во ВСЕХ хешах, которые были переданы, Таким образом, член пересечения мы хотим.
Итак, чтобы подвести итоги анализа, grep вернет список всех ключей , которые встречаются в КАЖДОМ хэше (то есть N раз, где N - количество хэшей) Например. пересечение.