A resposta a uma solicitação HTTP é uma string como
'one=iwejdoewde&two=ijijjiiij&three=&four=endinghere'
Quero colocar essa consulta em um hash. Minha solução é
my $s = 'one=iwejdoewde&two=ijijjiiij&three=&four=endinghere';
my %h = $s.comb(/<-[&]>+/).map({ my @a = .split(/\=/); @a[0] => @a[1] }) ;
say %h;
#
# {four => endinghere, one => iwejdoewde, three => , two => ijijjiiij}
#
Acho que o $s
to %h
está feio. No entanto, ele lida com o three=
segmento sem quebrar.
Parece que deveria haver uma maneira melhor, particularmente criando um par a partir dos resultados do split
.
Isso parece funcionar para um par individual:
my $s='one=two';
say $s.match( / (.+) \= (.*) / ).pairup
mas colocá-lo dentro .map
leva a um resultado inesperado
my $s = 'one=iwejdoewde&two=ijijjiiij&three=&four=endinghere';
my %h = $s.comb(/<-[&]>+/).map( *.match(/ (.+) \= (.*) /).pairup )
say %h;
#
# {one iwejdoewde => (「two」 => 「ijijjiiij」), three => (「four」 => 「endinghere」)}
#
Supondo que os argumentos da consulta sejam separados por
&
e que cada argumento tenha um=
separador, então eu sugeriria que esta seria a maneira mais fácil de resolver isso:Observe que o truque está realmente
|
no resultado da segunda divisão que irá alimentar (deslizar) os valores separadamente na inicialização do%h
hash (em vez deList
entradas).Se você achar o termo
|
um pouco obscuro, pode ser mais explícito com*.split("=",2).Slip
.