There is in the spectests this example:

my $text  = "abc";
my %ret;
%ret = map { $_ => uc $_; }, split "", $text;
is ~%ret.kv, "a A b B c C", "=> works in a map block";

However, it seems from S06:

"|{...}| is always a block. However, if it is completely empty or consists of a single list, the first element of which is either a hash or a pair, it is executed immediately to compose a Hash object."

That this means the { $_ => uc $_; } above would end up composing a Hash object (unless the semicolon is meant to throw a spanner in the hash-composer works?) It says you can use sub to disambiguate, but

%ret = map sub { $_ => uc $_; }, split "", $text;

Doesn't work since $_ isn't an automatic parameter for a sub, like it would be in just a block (in the implementation, and if I understand correctly in the spec too).

%ret = map sub { $^a => uc $^a; }, split "", $text;

Will work, of course... But anyway, I guess either of:

* The test is wrong to expect to have that parsed as a block
* The semicolon disambiguates it - I don't see any suggestion of that in the spec, though, so if it's the case a note on this would be helpful



Reply via email to