Какой смысл в карте Perl? - PullRequest
       30

Какой смысл в карте Perl?

30 голосов
/ 26 сентября 2008

Не совсем понял смысл функции карты. Кто-нибудь может объяснить примерами его использования?

Есть ли какие-либо преимущества в производительности при использовании этого вместо цикла или это просто сахар?

Ответы [ 16 ]

4 голосов
/ 26 сентября 2008

Создать пароль:

$ perl -E'say map {chr(32 + 95 * rand)} 1..16'
# -> j'k=$^o7\l'yi28G
4 голосов
/ 26 сентября 2008

Перефразируя «Эффективное программирование на Perl» Холла и Шварца, Картой можно злоупотреблять, но я думаю, что лучше использовать ее для создания нового списка из существующего списка.

Создайте список квадратов 3,2 & 1:

@numbers = (3,2,1);
@squares = map { $_ ** 2 } @numbers;
3 голосов
/ 26 сентября 2008

Позволяет вам преобразовать список в выражение , а не в операторы . Представьте, что хэш солдат определен так:

{ name          => 'John Smith'
, rank          => 'Lieutenant'
, serial_number => '382-293937-20'
};

тогда вы можете работать со списком имен отдельно.

Например,

map { $_->{name} } values %soldiers

является выражением . Он может идти везде, где разрешено выражение - кроме того, что вы не можете его назначить.

${[ sort map { $_->{name} } values %soldiers ]}[-1]

индексирует массив, принимая макс.

my %soldiers_by_sn = map { $->{serial_number} => $_ } values %soldiers;

Я считаю, что одним из преимуществ операционных выражений является то, что они сокращают ошибки, возникающие из временных переменных.

Если мистер Маккой хочет отфильтровать все поля шляп для рассмотрения, вы можете добавить эту проверку с минимальным кодированием.

my %soldiers_by_sn 
    = map  { $->{serial_number}, $_ } 
      grep { $_->{name} !~ m/Hatfield$/ } 
      values %soldiers
      ;

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

3 голосов
/ 26 сентября 2008

Используется каждый раз, когда вы хотите создать новый список из существующего списка.

Например, вы можете отобразить функцию анализа в списке строк для преобразования их в целые числа.

1 голос
/ 30 сентября 2008

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

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

perl -e '@x=("x"); map { push @x, $_ } @x'
perl -e '@x=("x"); push @x, $_ for @x'

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

1 голос
/ 26 сентября 2008

Как уже говорили другие, карта создает списки из списков. Подумайте о «отображении» содержимого одного списка в другой. Вот некоторый код из программы CGI, чтобы взять список номеров патентов и напечатать гиперссылки на патентные заявки:

my @patents = ('7,120,721', '6,809,505', '7,194,673');
print join(", ", map { "<a href=\"http://patft.uspto.gov/netacgi/nph-Parser?Sect1=PTO1&Sect2=HITOFF&d=PALL&p=1&u=/netahtml/srchnum.htm&r=0&f=S&l=50&TERM1=$_\">$_</a>" } @patents);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...