2016-04-12 6 views
0

Ich habe eine Funktion geschrieben, um die Ausgabe des Befehls, der auf einer Linux-Box ausgeführt wird, zu analysieren. Ich möchte, dass die Funktion die Befehlsausgabe analysiert und die Ausgabe an die aufrufende Funktion zurückgibt. Ich möchte die Ausgabe analysieren, um 0/9999 (0%) zu bekommen und 0 und 9999 zurückzugeben. (Anmerkung: diese Zahlen sind nicht statisch. Es könnte eine beliebige Anzahl von Ziffern sein. Zum Beispiel 4567/100000 (45%)). Die Regex, die ich verwendet habe, ist falsch, denke ich. Ich erhalte die als 0 ausgegebenPerl regulären Ausdruck mit Split-Funktion

Befehlsausgabe:

Connecting to host 8.2.0.2, port 7775 
[ 4] local 9.1.1.2 port 37675 connected to 8.2.0.2 port 7775 
[ ID] Interval   Transfer  Bandwidth  Total Datagrams 
[ 4] 0.00-2.40 sec 5.49 MBytes 19.2 Mbits/sec 10000 
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval   Transfer  Bandwidth  Jitter Lost/Total Datagrams 
[ 4] 0.00-2.40 sec 5.49 MBytes 19.2 Mbits/sec 5.958 ms 0/9999 (0%) 
[ 4] Sent 9999 datagrams 

iperf Done. 

Funktion:

sub test_output { 

    my ($self) = @_; 
    my $packets = 0; 

    $self->{output_obj}->_exec('enter the command here'); 

    my @output = $self->{output_obj}->out(); 

    foreach my $line (@output) { 
     if ($line =~ /(\d+\/\d+\s.*)/) { 

      packets = $1 
     } 
    } 
    my @values = split('/', $packets); 
    foreach my $val (@values) { 
     return "$val\n"; 
    } 
} 

Funktionsaufruf:

$self->{'client'} = $self->{'exec_obj'}->test_output() 

Erwartete Rückgabewert der Funktion:

lost : 0 
total : 9999 
lost percentage: 0% 
+0

Sie haben hier ein paar Probleme. 1. Das RE-Matching gegen "$ line" wird mit "0/9999 (0%)" übereinstimmen, wenn Sie also auf "/" teilen, erhalten Sie "0" und "9999 (0%)". 2. Sie setzen eine Rückkehr in die foreach-Schleife. Sie geben den ersten Wert zurück, in diesem Fall "0" ... und das war's. Nicht sicher, was du zurückgeben willst. Wenn es eine Liste ist, warum gibst du @values ​​nicht einfach zurück? –

+0

@MichaelAlbers Ich möchte 0, 9999 und 0% separat zurückgeben. – user3587025

+0

Die einzige Möglichkeit, die ich in Perl kenne, ist die Rückgabe einer Liste. Sie können nicht mehrmals von einer Funktion zurückkehren. Was ist, wenn Sie Folgendes versuchen: 'if ($ line = ~/(\ d +) \/(\ d +) [^ (] * \ ((\ d +%) \) /) {return ($ 1, $ 2, $ 3); } Ich denke, das könnte Sie bekommen, was Sie wollen (beachten Sie, ich habe das nicht getestet, aber ich denke, es sollte nahe zu korrigieren sein.) –

Antwort

0
sub test_output { 

    my $self = shift; 

    $self->{output_obj}->_exec('enter the command here'); 

    my @output = $self->{output_obj}->out(); 

    foreach my $line (@output) { 
     if ($line =~ m/(\d+)\/(\d+)\s\((\d+%)\)/) { 
      my ($lost, $total, $percentage) = ($1, $2, $3); 

      return ($lost, $total, $percentage); 
     } 
    } 
} 

my ($lost, $total, $percentage) = $self->{'exec_obj'}->test_output()