why is it a "horrible" hash concatenation trick?
It's just that it does way too much unnecessary operations. To "visualize" what's going on, you could tie the hash and put debugging prints into the routines like STORE, FETCH, etc. For example:
#!/usr/bin/perl -l
package MyHash;
use Tie::Hash;
our @ISA = 'Tie::StdHash';
sub TIEHASH {
my $class = shift;
return bless {}, $class;
}
sub STORE {
my $self = shift;
print "storing $_[0] => $_[1]";
$self->SUPER::STORE(@_);
}
sub FETCH {
my $self = shift;
print "fetching @_";
$self->SUPER::FETCH(@_);
}
sub CLEAR {
my $self = shift;
print "clear";
$self->SUPER::CLEAR();
}
package main;
use strict;
use warnings;
use Data::Dumper;
tie my %myhash, "MyHash";
print "Variant 1 (bad):";
%myhash = ( %myhash, "key_$_" => { foo => 42 } ) for 1..5;
print "\nDumping...";
print Dumper \%myhash;
%myhash = ();
print "\nVariant 2 (good):";
$myhash{"key_$_"} = { foo => 42 } for 1..5;
print "\nDumping...";
print Dumper \%myhash;
__END__
Variant 1 (bad):
clear
storing key_1 => HASH(0x65ecb0)
fetching key_1
clear
storing key_1 => HASH(0x65ecb0)
storing key_2 => HASH(0x6c2050)
fetching key_1
fetching key_2
clear
storing key_1 => HASH(0x65ecb0)
storing key_2 => HASH(0x6c2050)
storing key_3 => HASH(0x74a420)
fetching key_3
fetching key_1
fetching key_2
clear
storing key_3 => HASH(0x74a420)
storing key_1 => HASH(0x65ecb0)
storing key_2 => HASH(0x6c2050)
storing key_4 => HASH(0x74a3f0)
fetching key_3
fetching key_1
fetching key_4
fetching key_2
clear
storing key_3 => HASH(0x74a420)
storing key_1 => HASH(0x65ecb0)
storing key_4 => HASH(0x74a3f0)
storing key_2 => HASH(0x6c2050)
storing key_5 => HASH(0x74aaf0)
Dumping...
fetching key_3
fetching key_1
fetching key_5
fetching key_2
fetching key_4
$VAR1 = {
'key_3' => {
'foo' => 42
},
'key_1' => {
'foo' => 42
},
'key_5' => {
'foo' => 42
},
'key_2' => {
'foo' => 42
},
'key_4' => {
'foo' => 42
}
};
clear
Variant 2 (good):
storing key_1 => HASH(0x74ac80)
storing key_2 => HASH(0x737c40)
storing key_3 => HASH(0x6c2050)
storing key_4 => HASH(0x74ad00)
storing key_5 => HASH(0x74ac00)
Dumping...
fetching key_3
fetching key_1
fetching key_5
fetching key_4
fetching key_2
$VAR1 = {
'key_3' => {
'foo' => 42
},
'key_1' => {
'foo' => 42
},
'key_5' => {
'foo' => 42
},
'key_4' => {
'foo' => 42
},
'key_2' => {
'foo' => 42
}
};
|