Подтвердить что ты не робот

В Perl целесообразно использовать карту в контексте void вместо цикла foreach?

В Perl, если у вас такой цикл:

foreach (@items) {
    perform_action($_);
}

вы можете заменить его вызовом map в контексте void:

map {
    perform_action($_)
} @items;

Есть ли какие-либо преимущества или недостатки? Имеет ли это влияние на производительность, поскольку Perl считает, что он должен сохранить результаты? Улучшает/ухудшает читаемость?

4b9b3361

Ответ 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.