Perl:数组取消引用

时间:2011-11-11 11:23:12

标签: perl multidimensional-array

我正在试图弄清楚如何取消引用数组中的值但是已经达到了死胡同,我试图研究这个问题但需要一些帮助。

我从infoblox数据库中获取一些数据,并尝试在结果中搜索以查找主机条目的mac地址,数据作为哈希生成在数组中,由以下代码生成:

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

我使用'$ _-> ipv4addrs'在高级数据结构中取消引用,然后使用以下代码循环输出:

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

使用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' )
    ];

但如果我尝试在'foreach(@searh)'循环中使用'$ _-> mac'调用引用,我会收到错误:

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

此时我的编码技能失败,任何信息或方向都会受到高度赞赏。

2 个答案:

答案 0 :(得分:2)

数组中的第一个元素是受祝福的引用。

$_->[0]->mac

您可以使用->运算符直接访问数组引用中的元素(如上所述),也可以将它们完全取消引用到列表中:@list = @{$array_reference}

答案 1 :(得分:1)

@search中存储的每个项目都是一个arrayref。

# 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;
                                    |     }
                                    | }