2016-04-05 14 views
0

Aşağıdaki işlev bir yönlendiriciye giriş yapar, IPsec oturum durumunu almak için bir komut yürütür ve arabirim adını ve ip adresini dize olarak döndürür. Bir dizgeyi döndürmek yerine, işlevlerin karma dizisini döndürmesini istiyorum. Birisi bana yardım edebilir mi?Perl'de karma dizisi döndürme

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

Fonksiyon çağrı:

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

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

Bu durumda, Status => Ip'in bir karması olmasını istediğiniz anlamına mı geliyorsunuz? Ve bunun hoşuna gitti mi? –

+0

@Ed Dunn ben ip ve durum ({, => "yukarı" ip => "x.x.x.x", durumu } ) karmaları Array dizisi = olarak döndürülür istiyorum; – virat

+0

Çıktı nasıl görünüyor? Bir örnek alabilir miyiz? –

cevap

1

Bu yapmalıyım:

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

Bu Session status hat çıkışı önce Peer hattını görünür varsayar. Eğer başka bir yol varsa (yönlendirici çıktısının neye benzediğine dair bir örnek vermediyseniz, bu yüzden biraz tahmin etmeliyim ...) yani: Peer hattının Session status satırından önce olması bu şekilde olmalıdır. :

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 
# 

Orada algoritmada hiçbir gerçek fark - çıktıda ikinci hangisi - Peer veya Session status - sonu kaydını tanımlayan ve karma iki giriş ile oluşturulan ve @session_states dizinin üzerine itilir.

+0

Bu cevabın daha önceki bir sürümünde, çıktıdaki çizgilerin görünüm sırasına bağımlılığı almadım. Kodun bu versiyonu muhtemelen işe yaramazdı. – Marty