2

I'm trying to figure out how to de-reference a value in an array but have hit a dead end, I've attempted to research the issue but need some help.

I'm grabbing some data from an infoblox database and trying to search within the results to find the mac address of a host entry, the data exists in the array as a hash generate by the following code:

use strict;
use Data::Dumper;
my @results = $session->get(
   object  => "Infoblox::DNS::Host",
   name    => "test.com.au",
   ipv4addrs   => ".*.",
   view    => "external"
);

I'm de-referencing at a high level of the data structure using '$_->ipv4addrs' then looping over the output using the following code:

foreach (@results) {
    my @search = $_->ipv4addrs;        
         foreach (@search) {
             print Dumper($_) . "\n";
    }
}

which prints the following output using Data::Dumper:

$VAR1 = [
      bless( {
               'network' => '111.111.111.0/25',
               'options' => [],
               'dynamic' => 'false',
               '__version' => '4.2r5-5-68691',
               'VIEW_FUNCTION' => {
                                    'remove' => '.com.infoblox.perl_api.Infoblox.DHCP.remove_fixed_address',
                                    'search' => '.com.infoblox.perl_api.Infoblox.DHCP.search_fixed_address',
                                    'add' => '.com.infoblox.perl_api.Infoblox.DHCP.insert_fixed_address',
                                    'add_using_template' => '.com.infoblox.perl_api.Infoblox.DHCP.insert_fixed_address_using_template',
                                    'get' => '.com.infoblox.perl_api.Infoblox.DHCP.get_fixed_address',
                                    'modify' => '.com.infoblox.perl_api.Infoblox.DHCP.modify_fixed_address'
                                  },
               'ipv4addr' => '111.111.111.111',
               'match_client' => 'MAC',
               'mac' => '00:11:00:11:00:11',
               'disable' => 'false',
               '__type' => '.com.infoblox.perl_api.Infoblox.DHCP.FixedAddr'
             }, 'Infoblox::DHCP::FixedAddr' )
    ];

But if I try and call a reference using '$_->mac' within the 'foreach (@searh)' loop, I get an error:

 "Can't call method "mac" on unblessed reference at ./connect_test.pl line nn."

My coding skills fail at this point, any info or direction would be much appreciated.

2 Answers 2

2

The first element in the array is the blessed reference.

$_->[0]->mac

You can directly access elements in array references with the -> operator (as above) or completely dereference them to a list: @list = @{$array_reference}.

Sign up to request clarification or add additional context in comments.

1 Comment

Thank you so much, simple when you know how.
1

Each item stored in @search is an arrayref itself.

# If arrayref contains only one     | # If multiple objects expected
# Infoblox::DHCP::FixedAddr object  | # inside @search
                                    |
                                    |
foreach ( @search ) {               | foreach my $item ( @search ) {
                                    | 
    my $obj = shift @$_;            |     foreach my $obj ( @$item ) {
    my $mac = $obj->mac;            |
}                                   |         my $mac = $obj->mac;
                                    |     }
                                    | }

1 Comment

Thank you for the examples Zaid, that has cleared up a sizeable gap in my knowledge base.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.