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%
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? –
@MichaelAlbers Ich möchte 0, 9999 und 0% separat zurückgeben. – user3587025
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.) –