[Moscow.pm] a=b&c=d

Сергей Мартынов sergey на martynov.info
Сб Дек 22 15:37:55 PST 2007


> > потом убрал временные переменные $a и $b:
> >     /(.*?)=(.*)/, $h{$1} = $2 for split /&/;
> > А вот как записать то же совсем без $1 и $2?

> как-то так, например:
> my %h = map { split /=/ } split /&/;

Подход мне нравится, только неаккуратно работает с двух сторон:

1) если в куске нет знака "=" (например "a=b&c&d=e"), то весь хэш портится

2) в значении может быть неэкранированный знак равенства (это вполне
нормальная ситуация), например "a=b=c"

С учетом этого, надо как-то так:

my %h = map { /=/ ? split /=/, $_, 2 : ($_, undef) } split /&/;


А вот другой вариант, чисто на одном регулярном выражении :)

my %h = /([^&=]+)(?:=([^&]*))?&?/g;


Только все эти эксперименты надо крайне осторожно переносить на
практику, поскольку в реальной жизни встречается множество тонкостей.
Недавно как раз спорили об этом в ru_perl:
http://community.livejournal.com/ru_perl/223149.html?thread=1993901


Подробная информация о списке рассылки Moscow-pm