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' );

См также:

3 комментария:

cmdx комментирует...

Сергей, а можно ссылку на тест из новости "List Comprehension средствами Perl" поправить?
Она ни у кого не откроется, кроме вас, как автора.

Наувул-Наувул комментирует...

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

Напишите процедуры, которые:
http_GET_by_hash - по хэшу строит строку GET-запроса,
hash_by_http_GET - по строке GET-запроса строит хэш параметров/значений.

Анонимный комментирует...

Питоновский map:
dict([tuple(a.split('=')) for a in 'a=b&c=d&e=f'.split('&')])