2016-04-05 98 views
0

以下函数登录到路由器,执行命令以获取IPsec会话状态并以字符串形式返回接口名称和IP地址。而不是返回一个字符串,我希望该函数返回散列数组。有人可以帮我解决这个问题吗?在perl中返回哈希数组

sub cryptoSessionStatus { 
    my ($self,$interface) = @_; 
    my $status = 0; 
    my $peer_ip = 0; 

    #command to check the tunnel status 
    my $cmd  = 'command goes here ' . $interface; 
    #$self->_login(); 
    my $tunnel_status = $self->_login->exec($cmd); 

    #Regex to match the 'tunnel status' and 'peer ip' string in the cmd output 
    #Session status: DOWN/UP 
    #Peer: x.x.x.x 
    foreach my $line ( $tunnel_status) { 
     if ($line =~ m/Session\s+status:\s+(.*)/) { 
      $status = $1; 
     } 
     if ($line =~ m/Peer:\s+(\d+.\d+.\d+.\d+)/) { 
      $peer_ip = $1; 
     } 
    } 

    return ($status,$peer_ip); 
} 

函数调用:

my $tunnel_obj = test::Cryptotunnels->new('host'=> 'ip'); 

my $crypto_sessions = $tunnel_obj->cryptoSessionStatus("tunnel1"); 
+0

你的意思是你想要有一个散列Status => Ip?你想那样回来? –

+0

@Ed Dunn我想要ip和状态作为哈希阵列返回Array =( { ip =>“x.x.x.x”, status =>“up”, } ); – virat

+0

输出结果如何?我们能拿到样品吗? –

回答

1

这应做到:

my @session_states; 
my $status; 
foreach my $line ( $tunnel_status) { 
    if ($line =~ m/Session\s+status:\s+(.*)/) { 
     $status = $1; 
    } 
    if ($line =~ m/Peer:\s+(\d+.\d+.\d+.\d+)/) { 
     push @session_states, { ip => $1 , status => $status }; 
     $status = "" 
    } 
} 
return \@session_states; 
# 
# called like so 
# 
my $tunnel_obj = test::Cryptotunnels->new('host'=> 'ip'); 
my $crypto_sessions = $tunnel_obj->cryptoSessionStatus("tunnel1"); 
for my $obj (@$crypto_sessions) { 
    print $obj->{ip}, "\n"; 
    print $obj->{status}, "\n"; 
} 

这是假设Session status线出现之前在输出中Peer线。如果相反(你没有提供路由器输出样本的样本,所以我必须猜测一下......)ie:如果Peer行在Session status行之前,那么它应该是这样的:

my @session_states; 
my $peer_ip; 
foreach my $line ( $tunnel_status) { 
    if ($line =~ m/Session\s+status:\s+(.*)/) { 
     push @session_states, { ip => $peer_ip , status => $1 }; 
     $peer_ip = ""; 
    } 
    if ($line =~ m/Peer:\s+(\d+.\d+.\d+.\d+)/) { 
     $peer_ip = $1; 
    } 
} 
return \@session_states; 
# 
# called the same as above 
# 

有一个在算法没有真正的差异 - 以先到者为准第二输出 - PeerSession status - 定义条目的端部和一个散列与所述两个条目创建并被推到@session_states阵列。

+0

在此答案的早期版本中,我没有提到对输出中行出现顺序的依赖。该版本的代码可能不会起作用。 – Marty