Everyone already answered the problem.
But another thing is I avoid using curly braces except when mapping to hashrefs. In this case:
my %y = map +( "prefix_$_" => 1 ), qw/a b c/;
As far as I know, using a block unnecessarily creates a lexical scope, which seems like a waste.
And speaking of waste, I notice you're pointing your hash to values of 1, probably intending to look at keys(%y) later. That's an unfortunate idiom if you ask me, as it points to a different copy of "1" every time. It's often better (though not important here for 3 values) to alias to undef if you're only concerned about getting a unique list of keys.