Второй метод передает ссылку на хеш, тогда как первый просто передает список.
Здесь есть два аспекта: теоретически, ссылка на хеш может быть лучше с точки зрения производительности, хотя для краткостисписки аргументов это незначительно.Для простого вызова, такого как foo(a => 1, b => 2)
, разницы в производительности нет, поскольку @_
фактически является псевдонимом исходных значений.
Но если вызывающая сторона уже имеет значения в хэше, первый стиль требует преобразованияиз хэша в список, а затем обратно в хэш, который может быть медленным.
Второй аспект - это вопрос, кто отвечает за преобразование в хеш.Первый стиль оставляет за собой вызываемую функцию, и если он просто делает my %args = @_
, он выдаст любопытные предупреждения, если список аргументов не будет четной длины.
Вот почему я немного предпочитаю второй стиль (или я использую Perl 6, который изначально поддерживает именованные аргументы).