Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

How can I remove an array element from the following data structer captured from data dumper:
$VAR2 = { 'CSTRING' => 'public', 'SPECIFIC' => '1', 'GENERIC' => '6', 'SSERVER' => 'testmachine', 'DATE' => 'Tue Feb 25 10:13:43 2003', 'OID' => '1.2.3.4.5', 'DEVICE' => '123.124.125.126', 'TRAPS' => { 'TRAP_LIST' => [ { 'TYPE' => 4, 'DATA' => 'foo', 'VARBIND' => '1.2.3.4.5' }, { 'TYPE' => 4, 'DATA' => 'bar', 'VARBIND' => '1.2.3.4.5' } ] }, 'PORT' => '161' };
I know the index of the array i.e. 1 for
{ 'TYPE' => 4, 'DATA' => 'bar', 'VARBIND' => '1.2.3.4.5' }
Is there an easy way to remove elements from the hash of arrays?

Replies are listed 'Best First'.
Re: hash array removal ?
by broquaint (Abbot) on Feb 25, 2003 at 15:41 UTC
    Assuming the data structure given above
    ## your best bet splice @{ $data->{TRAPS}->{TRAP_LIST} }, 1, 1; ## resets index to original undefined state delete $data->{TRAPS}->{TRAP_LIST}->[1]; ## shortens the array (generally not ideal) $#{ $data->{TRAPS}->{TRAP_LIST} }--;
    See. splice() for more info and Understanding splice for a good tutorial.
    HTH

    _________
    broquaint

Re: hash array removal ?
by jasonk (Parson) on Feb 25, 2003 at 15:40 UTC
    splice(@{$VAR2->{TRAPS}->{TRAP_LIST}},$index,1);
Re: hash array removal ?
by Zaxo (Archbishop) on Feb 25, 2003 at 15:46 UTC

    Dereference the array reference and apply splice.

    my $position = 1; splice @{$hash->{'TRAPS'}{'TRAP_LIST'}}, $position, 1;

    After Compline,
    Zaxo

      I think $hash->{'TRAPS'} is an array ref, so the above code won't work. I think broquaint had it right, by doing:

      my $position = 1; splice @{$hash->{'TRAPS'}->{'TRAP_LIST'}}, $position, 1;

        Unless Zaxo modified his code without telling anyone, they're effectively the same thing. Second and subsequent dereferencing arrows are optional.

        I think $hash->{'TRAPS'} is an array ref
        ...Yes it is
Re: hash array removal ?
by hgolan (Initiate) on Feb 25, 2003 at 16:41 UTC
    splice @{$VAR2->{'TRAPS'}->{'TRAP_LIST'}},$index; example splice @{$VAR2->{'TRAPS'}->{'TRAP_LIST'}},1 ;
      Ok...to make things more complicated I'm doing this with Tk, and I have a sub routine that looks like this:
      sub del { if (defined $list->curselection) { my $entry = $list->curselection; $list->delete($entry); $varbind = ''; $data = ''; print "INDEX: $index\n"; print "ENTRY: $entry\n"; my $position = ($single - 1); splice @{$hash->{'TRAPS'}->{'TRAP_LIST'}}, $position, $entry; } }
      This seems to work in the begging but fails shortly after.
      Any idea why?

      Is it that I have to grep for empty array's in the TRAP_LIST after the splice?

        i do not understand whts not working. splice onle remove (cut) the cells u ask. he doesnt care if the cell is realy there or not. lets say you have this program:
        #!/usr/bin/perl use Data::Dumper; $VAR2 = { 'CSTRING' => 'public', 'SPECIFIC' => '1', 'GENERIC' => '6', 'SSERVER' => 'testmachine', 'DATE' => 'Tue Feb 25 10:13:43 2003', 'OID' => '1.2.3.4.5', 'DEVICE' => '123.124.125.126', 'TRAPS' => { 'TRAP_LIST' => [ { 'TYPE' => 4, 'DATA' => 'foo', 'VARBIND' => '1.2.3.4.5' }, { 'TYPE' => 44, 'DATA' => 'bar', 'VARBIND' => '1.2.3.4.5' }, { 'TYPE' => 444, 'DATA' => 'bar', 'VARBIND' => '1.2.3.4.5' }, { 'TYPE' => 4444, 'DATA' => 'bar', 'VARBIND' => '1.2.3.4.5' } ] }, 'PORT' => '161' }; print Dumper $VAR2 ; del($VAR2); print Dumper $VAR2 ; sub del{ splice @{$VAR2->{'TRAPS'}->{'TRAP_LIST'}}, 2, 3; }
        when u call sub del he cut the array from index:2 3 cells. you can do splice @{$VAR2->{'TRAPS'}->{'TRAP_LIST'}}, 22, 43; and it will do nothing to the array, because cell 22 to 67 are not exists. you do not need to ask if the cell is defined or not if its defined he will cut him.