It's creating a hash named
%foo using a hash slice built out of the elements in
@foo. Then it's assigning to that slice the values
0 to (the number of elements). So if
@foo = ('a', 'b', 'c'), you get
@foo{'a', 'b', 'c'} = (0, 1, 2);
which is itself just shorthand for
$foo{'a'} = 0;
$foo{'b'} = 1;
$foo{'c'} = 2;
(technically,
@foo in scalar context returns a value one too large, so we're really mapping to
(0,1,2,3), but the odd element gets ignored. It might be more proper to use
$#foo there (the index of the last element, instead of the number of elements))