note
kcott
<p>
There's no difference. Both declare a hash with zero key/value pairs:
</p>
<code>
$ perl -Mstrict -Mwarnings -E '
my %x; say scalar keys %x; say scalar values %x;
my %y = (); say scalar keys %y; say scalar values %y;
'
0
0
0
0
</code>
<p>
Including an assignment has some overhead: typically negligible but may be significant in looping code.
</p>
<code>
#!/usr/bin/env perl
use strict;
use warnings;
use Benchmark qw{cmpthese};
cmpthese -1 => {
no_assignment => sub { my %hash },
assignment => sub { my %hash = () },
};
</code>
<p>Output:</p>
<code>
Rate assignment no_assignment
assignment 6672755/s -- -60%
no_assignment 16770827/s 151% --
</code>
<p>
I wouldn't necessarily consider one form to be <em>"more correct"</em> than the other.
</p>
<p>
I generally use the "<c>my %hash_data;</c>" form.
</p>
<p>
<small><em>[Minor Update: I removed "<c>use autodie;</c>" from the benchmark code as it wasn't necessary (it was an artefact from the last use of this script which I often rework for example code); retested; much the same results.]</em></small>
</p>
<!-- Node text goes above. Div tags should contain sig only -->
<div class="pmsig"><div class="pmsig-861371">
<p>-- Ken</p>
</div></div>
1085557
1085557