Использование карты или grep в Perl - PullRequest
14 голосов
/ 07 апреля 2011

Я пишу Perl-код на полную ставку уже пару месяцев (биоинформатика) и всегда стараюсь улучшить свои навыки.Только сегодня до меня дошло, что я никогда не использую карту или grep.Оглядываясь назад на мой код, я понимаю, что эти инструменты могут сэкономить мне пару строк здесь или там, но только за счет гибкости цикла foreach.Мой вопрос заключается в следующем:

Есть ли какие-либо обстоятельства, с которыми вы столкнулись, когда использование map или grep принесло существенное преимущество над циклом foreach / for, помимо сохранения одной или двух строк кода?

Спасибо за ваше время!

Ответы [ 2 ]

40 голосов
/ 07 апреля 2011

Пример преобразования Шварца :

@sorted = map  { $_->[0] }
          sort { $a->[1] cmp $b->[1] }
          map  { [$_, foo($_)] }
          @unsorted;

Вы можете сделать это с кучей foreach петель, но вам придется разбирать их на части, чтобы выяснить, что происходит; увидев преобразование Шварца, вы сразу узнаете идиому.

В целом, я думаю, map и grep хороши тем, что они позволяют вам четко и компактно представлять ваше намерение без слоев синтаксиса. Если вы видите map, то вы знаете, что происходит какое-то простое преобразование структуры данных; если вы видите grep, то вы знаете, что происходит некоторая фильтрация / выбор. Вы можете сделать все это с помощью foreach, но цель вашего кода не так ясна, как это было бы с map или grep; Вы можете даже сделать все это с if и goto, если хотите, но тогда ваше намерение будет скрыто под еще большим синтаксисом и отслеживанием состояний.

16 голосов
/ 07 апреля 2011

Я постоянно использую map и grep. И apply, first, any и многие другие из List::MoreUtils. Я обнаружил, что, в общем, они объясняют , что делает код, а не , как код делает это.

В общем, я считаю, что когда мой код читает то же самое, что и спецификация, он, скорее всего, будет правильным, а также с большей вероятностью обработает угловые / краевые случаи. Perl позволяет мне делать это намного лучше, чем любой другой язык, который я использовал в прошлом, и я этим пользуюсь.

Например, если моя спецификация говорит, что я сделаю foo(), если $blah есть в каком-то списке, мой код читается именно так:

foo() if any { $_ eq $blah } some_list();

Та же идея для остальных этих инструментов. Код и спецификация выглядят очень похожими, и это одна из замечательных особенностей Perl.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...