Показаны сообщения с ярлыком функциональное программирование. Показать все сообщения
Показаны сообщения с ярлыком функциональное программирование. Показать все сообщения

14 нояб. 2007 г.

List Comprehension средствами Perl

Решая один из вопросов теста, понял, как средствами Perl сделать подобие питоновского 'list comprehension'.

Задача: имеется строка запроса вида: 'param1=foo&param2=bar...'
Необходимо получить хэш: (param1 => 'foo', param2=>'bar'...)

Прямолинейное решение:
sub query2hash {
my $query = shift;
my @arr;
foreach (split /&/, $query) {
push @arr, split /=/, $_;
}
@arr;
}
Каждому, кто знаком с "list comprehension" в языке Python, столь многословная инициализация массива @arr покажется каменным веком. Выполнив на Python-е:
query = 'param1=foo&param2=bar&param3=zoo'
arr = [ pair.split('=') for pair in query.split('&') ]
мы получим список списков:
[['param1', 'foo'], ['param2', 'bar'], ['param3', 'zoo']]
Можно ли написать на Perl столь же лаконичную конструкцию?...
Проще простого:
sub query2hash {
map { split /=/ } split /&/, shift;
}
Всего строчка! Более того, в Python-е предстоит еще повозиться, чтобы преобразовать список списков в словарь. А тут мы получаем хэш даром. Достаточно присвоить список, возвращаемый функцией, хэш-переменной:
my %params
= query2hash( 'param1=foo&param2=bar&param3=zoo' );

См также: