2016-04-05 11 views
0

Die folgende Funktion meldet sich bei einem Router an, führt einen Befehl zum Abrufen des IPsec-Sitzungsstatus aus und gibt den Schnittstellennamen und die IP-Adresse als Zeichenfolge zurück. Anstatt eine Zeichenfolge zurückzugeben, möchte ich, dass die Funktion ein Hash-Array zurückgibt. Kann mir da jemand helfen?Array von Hashes in Perl zurückgeben

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

Funktionsaufruf:

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

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

Meinst du, du willst, dass es einen Hash von Status => Ip gibt? Und du möchtest, dass das zurückkommt? –

+0

@Ed Dunn möchte ich die ip und den Status als Array von Hashes Array zurückgegeben werden = ( { ip => "x.x.x.x", status => "nach oben", } ); – virat

+0

Wie sieht die Ausgabe aus? Können wir eine Probe bekommen? –

Antwort

1

Dies sollte es tun:

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

Dies setzt voraus, die Session status Linie vor die Peer Zeile in der Ausgabe erscheint. Wenn es umgekehrt ist (Sie haben kein Beispiel geliefert, wie die Router-Ausgabe aussieht, also muss ich ein bisschen raten ...). Dh wenn die Peer Zeile vor der Session status Zeile steht, dann sollte es so sein :

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 
# 

Es gibt keinen Unterschied in dem Algorithmus - je nachdem, was an zweiter Stelle in der Ausgabe kommt - Peer oder Session status - definiert das Ende des Eintrags und eine Hash wird mit den beiden Eingaben und Aufschieben auf die @session_states Array erstellt.

+0

In einer früheren Version dieser Antwort habe ich die Abhängigkeit von der Reihenfolge des Auftretens der Zeilen in der Ausgabe nicht aufgenommen. Diese Version des Codes hätte wahrscheinlich nicht funktioniert. – Marty

Verwandte Themen