On Mon, May 29, 2006 at 05:28:53PM -0700, Ovid wrote:
> I also tried to do this:
> my ($n, $v) = $nv.split('=').map(decode($_));
> That and a number of other variants all failed miserably with errors similar
to:
> Can't modify constant item: VStr ...
Many thanks to Joel and ovid, your suggestions are extremely
enlightening. The "Can't modify constant item: VStr..." is showing up
because my "decode" sub is trying to modify it's argument in-place
(not a copy of the argument). Adding the "is copy" phrase allows it to
work as expected. hmm... I like that.
Joel's point about auto-vivification is good, It's not a bug, it's a
feature, dammit. I'm gonna use it. Strangely %q<$n>.push($v); doesn't
work, but %q.{$n}.push($v); does. What's the difference?
#!/usr/bin/pugs
my %q = ();
for %ENV<QUERY_STRING>.split('&') -> $nv {
my ($n, $v) = $nv.split('=').map: &decode;
%q.{$n}.push($v); # auto-vivify!!
}
print "content-type: text/html\n\n";
for (%q.keys) { say "$_ => "~%q.{$_}.join(', ')~'<br>' }
sub decode(my $input is copy) {
$input ~~ s:Perl5:g/\+/ /;
$input ~~ s:Perl5:g/%(..)/{chr(:16($0))}/;
return $input;
}