grep
возвращает те элементы исходного списка, которые соответствуют выражению, тогда как map
возвращает результат выражения, примененного к каждому элементу исходного списка.
$ perl -le 'print join " ", grep $_ & 1, (1, 2, 3, 4, 5)'
1 3 5
$ perl -le 'print join " ", map $_ & 1, (1, 2, 3, 4, 5)'
1 0 1 0 1
Первый пример печатает все нечетные элементы списка, а второй пример печатает 0 или 1 в зависимости от того, является ли соответствующий элемент нечетным или нет.