Perl build and parse URL query strings
Perl
use strict;
use warnings;
use URI::Escape qw(uri_escape_utf8 uri_unescape);
sub build_query {
my (%params) = @_;
return join '&', map {
my $key = $_;
my @vals = ref $params{$key} eq 'ARRAY' ? @{ $params{$key} } : $params{$key};
map { uri_escape_utf8($key) . '=' . uri_escape_utf8($vals[$_]) } 0 .. $#vals;
} sort keys %params;
}
sub parse_query {
my ($qs) = @_;
my %out;
for my $pair (grep { length } split /[&;]/, $qs // '') {
my ($k, $v) = map { uri_unescape($_) } split /=/, $pair, 2;
push @{ $out{$k} }, $v // '';
}
return \%out;
}
my $qs = build_query(q => 'a b&c', tag => [qw(x y)]);
print "$qs => @{ parse_query($qs)->{tag} }\n";