Thanks! I guess I'm kind of lucky for this bug, otherwise I might have taken a lot longer to figure out what to do. :)
On Wed, May 7, 2014 at 4:44 AM, Larry Wall <la...@wall.org> wrote: > On Sun, May 04, 2014 at 10:40:16AM +0100, Philip Hazelden wrote: > : Hi, > : > : I'm trying to create a one-element array containing a hash. I eventually > : managed to do this from the REPL, but when I create a script containing > the > : same commands, it doesn't work. > : > : $ cat test.p6 > : my %h = (y => 1, x => 1); > : say [item %h].elems; > : say [item %h][0].WHAT; > : $ perl6 test.p6 > : 2 > : (Pair) > : $ cat test.p6 | perl6 > : > my %h = (y => 1, x => 1); > : ("x" => 1, "y" => 1).hash > : > say [item %h].elems; > : 1 > : > say [item %h][0].WHAT; > : (Hash) > : > > : $ perl6 -v > : This is perl6 version 2014.04 built on parrot 6.1.0 revision 0 > : > : `cat test.p6 | perl6` does what I expect it to, but `perl6 test.p6` seems > : to be flattening the hash into the array despite the 'item'. > > item as a list operator is going to put %h into a list context and > flatten it into two pairs before the function ever sees it, so the > 2/(Pair) is actually correct behavior. What's really going on in > the other case is that the REPL is somehow losing the contents of > %h between the prompts. You can show this is what is happening by > putting all three lines on a single line, in which case the REPL > version behaves like the run-from-file version. > > : Is this a bug, or am I missing something? (I don't claim much > understanding > : of how this *should* work, but getting two different behaviours feels > : wrong.) > > Yes, but the bug is facing the other direction. :-) > > : On a whim, I tried to replace 'item %h' with '%h.item', and both methods > of > : execution now give the results I was expecting, i.e. "1" and "(Hash)". > > That avoids the list flattening before itemizing. You can also just > write $(%h) or even $%h there to have the same effect. > > Larry >