$data{@header} = (); # To label the data.
This expression evaluates the array @header in scalar context. An array evaluated in scalar context yields the number of elements in the array.
@data{@header} = (); # To label the data.
This expression is a slice. The elements of @header are used as hash keys, to which values are assigned from the list on the RHS of the assignment. Since this list is empty in both statements, all the values assigned in both cases are undef.
c:\@Work\Perl\monks>perl -wMstrict -MData::Dump -le
"my %data;
my @header = qw(fee fie foe fum);
;;
$data{@header} = ();
dd \%data;
;;
@data{@header} = ();
dd \%data;
"
{ 4 => undef }
{ 4 => undef, fee => undef, fie => undef, foe => undef, fum => undef }
Give a man a fish: <%-{-{-{-<