Hi list,

While tracking some mysteries in a script behavior I hit an interesting feature.
"DELETE hash element" seems to create one, when it's missing. It may be normal 
and well known in the Perl milieu, but new to me.

Here is a test script, a baby scenario of new records updating an archive
- - -
#!/usr/local/bin/perl -w
# delete hash element creates one
use strict; $\ = "\n";
my %H=(); my ($ip,$nam,@nams);
$H{'218.212.233.69'}={'cat.com',1,'dog.br',1};
$H{'59.40.24.92'}{unknown}=1;
$H{'81.209.148.120'}={'sea.shell.nu',1,'news.cnn.cn',1};
$H{'221.11.133.66'}{'cow.nl'}=1;
print ".. new records";
map{print "$_: ",join ', ',sort keys %{$H{$_}}}sort keys %H;
print "\n.. update archive";
while (<DATA>){chomp; $_ || last; print;
    ($ip,$nam) = /^([\d.]+) #(.*)$/;
    exists $H{$ip} || next;
    @nams = split / /,$nam;
    map{exists $H{$ip}{$_}
     && delete [EMAIL PROTECTED]; # trim duplicate names
    push @nams,keys %{$H{$ip}}; # append new names
    delete $H{$ip};
#   delete $H{$ip}{any}; # create $H{$ip}
    print "   -> $ip #",join ' ',sort @nams; # updated archive record
}
print "\n.. new records trimmed";
map{print "$_: ",join ', ',sort keys %{$H{$_}}}sort keys %H;
__END__
59.40.24.92 #unknown
66.94.234.13 #yahoo.com
218.212.233.69 #cat.com mouse.org
221.11.133.66 #horse.uk
- - -
normal output:
. new records
218.212.233.69: cat.com, dog.br
221.11.133.66: cow.nl
59.40.24.92: unknown
81.209.148.120: news.cnn.cn, sea.shell.nu

. update archive
59.40.24.92 #unknown
   -> 59.40.24.92 #unknown
66.94.234.13 #yahoo.com
218.212.233.69 #cat.com mouse.org
   -> 218.212.233.69 #cat.com dog.br mouse.org
221.11.133.66 #horse.uk
   -> 221.11.133.66 #cow.nl horse.uk

. new records trimmed
81.209.148.120: news.cnn.cn, sea.shell.nu
- - -

output when the statement "delete $H{$ip}{any};" is active:

same as above up to ..

. new records trimmed
218.212.233.69: 
221.11.133.66: 
59.40.24.92: 
81.209.148.120: news.cnn.cn, sea.shell.nu
- - -

It looks as if Perl processes DELETE as follows:
1- create the missing element
2- delete the terminal element, as requested
3- leave behind the higher structure

The moral: leave the dead alone, for they haunt you.

Cheers

Reply via email to