while the explanation of Eliya++ pretty much solves the issue, I noticed a strange behaviour. if I do exactly the same but using a tied hash, Perl seems to parse the instruction differently. no key with undef value is created at all.
#!/usr/bin/env perl
use 5.010;
use warnings;
use strict;
use Tie::Hash;
use Data::Dumper;
package DEBUGHASH;
use base 'Tie::Hash';
sub TIEHASH {
my $self = bless {}, shift;
warn "TIEHASH $self\n";
return $self;
}
sub STORE {
my($self, $key, $val) = @_;
warn "STORE $self $key=$val\n";
$self->{$key} = $val;
}
sub FETCH {
my($self, $key) = @_;
warn "FETCH $self $key\n";
return $self->{$key};
}
sub EXISTS {
my($self, $key) = @_;
warn "EXISTS $self $key\n";
return exists $self->{$key};
}
sub FIRSTKEY {
my($self) = @_;
warn "FIRSTKEY $self\n";
my $key = scalar keys %{$self};
return each %{$self};
}
sub NEXTKEY {
my($self, $lastkey) = @_;
warn "NEXTKEY $self $lastkey\n";
return each %{$self};
}
package main;
my %x;
tie %x, 'DEBUGHASH';
$x{a} &&= 1;
# this one, instead, generates the 'a' => undef key
# $x{a} = $x{a} && 1;
say Dumper(\%x);
# just to check that the hash really works...
$x{b} = 42;
say Dumper(\%x);
running the code above I get:
TIEHASH DEBUGHASH=HASH(0x649f78)
FETCH DEBUGHASH=HASH(0x649f78) a
FIRSTKEY DEBUGHASH=HASH(0x649f78)
$VAR1 = {};
STORE DEBUGHASH=HASH(0x649f78) b=42
FIRSTKEY DEBUGHASH=HASH(0x649f78)
FETCH DEBUGHASH=HASH(0x649f78) b
NEXTKEY DEBUGHASH=HASH(0x649f78) b
$VAR1 = {
'b' => 42
};
probably not worth further investigation, but curious nonetheless :-)
cheers,
Aldo
King of Laziness, Wizard of Impatience, Lord of Hubris
|