MI.Sarwar
MI.Sarwar

Reputation: 153

Deleting Key from 2D Hash in Perl

My Hash looks like this

%hIDSet = (
      'TSASD2' => {
                    'country' => 'US',
                    'newid' => 'IMRAN',
                    'oldid' => 'TSASD4'
                  }

      'TS767' => {
                   'country' => 'DE',
                   'newid' => 'B90LKT',
                   'oldid' => '432553'
                 },
    );

when I do

my $sID = "TSASD2";
delete $hIDSet{$sID};

The output I get is

%hIDSet = (
  'TSASD2' => {},
  'TS767' => {
               'country' => 'DE',
               'newid' => 'B90LKT',
               'oldid' => '432553'
             },
);

My question is why the ID is not deleted completely?

Upvotes: 2

Views: 168

Answers (2)

ikegami
ikegami

Reputation: 385789

You did delete the key, so you must have recreated it before dumping the hash again as in the following snippet:

my $sID = "TSASD2";
my %hIDSet = ( $sID => {} );
delete $hIDSet{$sID};
print(Dumper(\%hIDSet));  # It's gone
if ($hIDSet{$sID}{foo}) { '...' }
print(Dumper(\%hIDSet));  # You've recreated it.

Keep in mind that

$hIDSet{$sID}{foo}

is short for

$hIDSet{$sID}->{foo}

and that

EXPR->{foo}

means

( EXPR //= {} )->{foo}

so

$hIDSet{$sID}{foo}

means

( $hIDSet{$sID} //= {} )->{foo}

Note that this can assign to $hIDSet{$sID}.

Upvotes: 4

amon
amon

Reputation: 57600

Cannot reproduce.

You are confusing the syntax for Perl hashes, and hashref literals. This signifies a hashref:

use Data::Dumper;
my $hashref = {
  foo => 'bar', # ← note comma between items
  baz => 'qux',
};
delete $hashref->{foo};
print Dumper $hashref;
# $VAR1 = { baz => "qux" };

On the other hand, hashes are just lists:

use Data::Dumper;
my %hash = ( # note parens
  foo => 'bar',
  baz => 'qux',
);
delete $hash{foo};
print Dumper \%hash;
# $VAR1 = { baz => "qux" };

The code your provided shouldn't compile because of a missing comma, and would fail to run with use strict; use warnings; because of the hash–hashref mismatch. Clean up the types, and it should work allright.

Upvotes: 3

Related Questions