A slice returns a list and assigning a list to a scalar will just assign the last item in the list to the scalar. It's just the same as
Update: A slice in scalar context returns the last item in the slice, and that will be assigned to $broken_count. It's similar in effect to
my $foo = (1,2,3); # assigns 3 to $foo
map in scalar context returns what you're after: the length of the list. See map.
You may be more enlightened by the following small modification of your program:
my %bar = (
a => 'A',
b => 'B',
c => 'C',
d => 'D',
);
my $broken_count = @bar{'a', 'b'};
my $working_count = map {$_} @bar{'a', 'b'};
print "broken_count : $broken_count\n"; # B
print "working_count: $working_count\n"; # 2
Update: Listy things in scalary context (there's no such thing as a "list in scalar context") are all special cased. You need to consult the relevant docs to see what will happen for each specific case.
|