[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