Well, that doesn't exactly match your syntaxt, but I found
Ok, here is a start (with help from Corion)
#!/usr/bin/perl --
use strict;
use warnings;
use CGI;
use Data::Dump::Streamer;
Main(@ARGV);
exit(0);
BEGIN {
my %queries = (
# PHP::HTTPBuildQuery
# URL decoded: "foo[bar]=baz", "foo[quick][quack]=schmack"
"foo%5Bbar%5D=baz&foo%5Bquick%5D%5Bquack%5D=schmack" => {
foo => {
bar => "baz",
quick => { "quack" => "schmack" },
},
},
);
sub Main {
for my $query ( keys %queries ) {
my $q = CGI->new($query);
print $query, "\n", Dump( $queries{$query}, parse_str($q)
+), "\n";
}
} ## end sub Main
} ## end BEGIN
sub parse_str {
my ($q) = @_;
my %params;
for my $k ( $q->param ) {
my @v = $q->param($k);
my $level = \%params;
#~ my @k = grep length, split /\[([^\[]+)\]/, $k;
#~ use DDS; warn Dump( { " $k => ", [ $k =~ /([^\[\]]+)/g ] } );
my @items = $k =~ /([^\[\]]+)/g;
my $key = pop @items;
for (@items) {
$level->{$_} ||= {};
$level = $level->{$_};
}
$level->{$key} = \@v;
} ## end for my $k ( $q->param )
return \%params;
} ## end sub parse_str
__END__
foo%5Bbar%5D=baz&foo%5Bquick%5D%5Bquack%5D=schmack
$HASH1 = { foo => {
bar => 'baz',
quick => { quack => 'schmack' }
} };
$HASH2 = { foo => {
bar => [ 'baz' ],
quick => { quack => [ 'schmack' ] }
} };
|