В Perl уместно ли использовать map в пустом контексте вместо цикла foreach? - PullRequest
12 голосов
/ 13 ноября 2010

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

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

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

map {
    perform_action($_)
} @items;

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

Ответы [ 3 ]

17 голосов
/ 13 ноября 2010

Начиная с Perl 5.8.1 карта в пустом контексте не дорогая:

карта в пустом контексте больше не дорого. карта теперь учитывает контекст, и не будет создавать список, если вызывается в пустом контексте.

Но постфиксная форма for может быть более читабельной:

perform_action($_) for @items;
14 голосов
/ 13 ноября 2010

Проблема с использованием map или grep в пустом контексте носит в основном концептуальный характер. Оба являются конструкциями, работа которых заключается в возвращении списка. Отказ от этого списка приводит к запутанному коду, неясно о концепции listops. Я никогда не использую ни одного из них в пустом контексте.

То же самое чувствую и к троичному условному оператору. Его задача - возвращать значение, поэтому использование его в пустом контексте не имеет смысла и просто сбивает с толку людей.

Тем не менее, я бы не стал вкладывать слишком много акций в Perl::Critic или даже в PBP. Я думаю, что лучше, если книга существует, чем то, чего не существует, но люди слишком часто неправильно понимают всю суть и заканчивают тем, что используют ее как дубинку.

4 голосов
/ 13 ноября 2010

Я считаю, что Perl Best Practices рекомендует использовать явную переменную в цикле foreach как лучший стиль - это, безусловно, то, что я бы использовал.

foreach my $item (@items)
{
    perform_action($item);
}

Это злоупотребление map (или grep) для использования в пустом контексте.

...