В Perl целесообразно использовать карту в контексте void вместо цикла foreach?
В Perl, если у вас такой цикл:
foreach (@items) {
perform_action($_);
}
вы можете заменить его вызовом map
в контексте void:
map {
perform_action($_)
} @items;
Есть ли какие-либо преимущества или недостатки? Имеет ли это влияние на производительность, поскольку Perl считает, что он должен сохранить результаты? Улучшает/ухудшает читаемость?
Ответы
Ответ 1
Начиная с Perl 5.8.1 карта в пустотном контексте не дорого:
отображение в пустотном контексте больше не дорогая. карта теперь контекстно-ориентированная, и не будет создавать список, если вызванный в контексте void.
Но постфиксная форма for
может быть более читаемой:
perform_action($_) for @items;
Ответ 2
Проблема с использованием map
или grep
в контексте void в основном концептуальна. Оба являются конструкциями, задачей которых является возврат списка. Отбросить этот список за путаный код, неясный по понятию переименований. Я никогда не использую ни один из них в пустоте контекста.
Я так же отношусь к тернарному условному оператору. Его задача - вернуть значение, поэтому использование его в пустотном контексте не имеет смысла и просто путает людей.
Тем не менее, я бы не поставил слишком много акций в Perl::Critic
или даже PBP. Я предполагаю, что лучше, чем книга существует, а не то, что она не делает, но люди слишком часто неправильно понимают весь смысл и в конечном итоге используют его как дубинку.
Ответ 3
Я считаю, что "Perl Best Practices" рекомендовал бы использовать явную переменную в цикле foreach
как лучший стиль - это, безусловно, то, что я бы использовал.
foreach my $item (@items)
{
perform_action($item);
}
Это злоупотребление map
(или grep
), чтобы использовать его в контексте void.