0

StackExchangeの投稿と無限の試行錯誤を読んだ数日後、私は世界に助けを求めることにしました。

次の複数行の文字列が格納されて$received_dataおり、すべての行に転送速度の値だけを出力する必要があります。

これが私のコードスニペットです:

my $received_data1 = 'Transfer Speed=81.9252432155658
2013/03/25 19:51:43,915|INFO|### STATUS: OK
2013/03/25 19:51:43,915|INFO|### DATA: Transfer Speed= 83.924363456758
2013/03/25 19:51:45,927|INFO|Checking FTP upload status...
2013/03/25 19:51:45,927|INFO|### INFO: Collect Throughput.
2013/03/25 19:51:45,927|INFO|Checking FTP upload status...
2013/03/25 19:51:45,927|INFO|### DATA: Transfer Speed=67.83685237005002';

my $regex =  qr/Transfer Speed=([0-9]{1,}[.][0-9]{1,}[^\n])/m;

if($received_data1 =~ $regex){
    #$received_data1 =~ s/$received_dat/$regex/gm;
    print $1;
}else{
    print "nothingFound";
}

からprint $1、最初の転送速度である81.9252432155658のみを取得できますが、他の転送速度は取得できません。/gm入力文字列が複数行であることをPerlに通知し、最初の一致が見つかった後も検索を続けるために、修飾子を渡しました。の正規表現は、次の$regexWebサイトでうまく機能します:http://www.solmetra.com/scripts/regex/index.phpそして私は一致した値の配列を取得します。

配列を取得するだけで十分です。配列をループして、値をファイルまたはコンソールに出力できるからです。

助けていただければ幸いです。

PS:私は他のStack Exchangeの投稿のほとんどを読みましたが、役に立ちませんでした。質問を複製しなかったといいのですが。私のリクエストに一致する質問があれば、リンクをいただければ幸いです。

4

2 に答える 2

2

gマッチオペレーションに修飾子が必要です。スカラーコンテキストで繰り返し呼び出すことができます

while ($received_data1 =~ /$regex/g) {
   print "$1\n";
}

またはリストコンテキストで1回呼び出す

for ($received_data1 =~ /$regex/g) {
   print "$_\n";
}

ノート:

  • スピードの前にスペースがありますが、あなたのパターンはそれを考慮していません。

  • /mもを使用しないので、役に立た^ない$

  • [^\n]なぜあなたがあなたのパターンで使っているのか分かりません。速度の最後の桁が途切れますが、これはおそらくあなたが意図したことではありません。

于 2013-03-26T12:44:29.677 に答える
2

別のアプローチ

my @matches = $received_data1 =~ m/Transfer Speed=\s*(\d+\.\d+)/g;

if (@matches) {
    foreach my $m (@matches) {
        print "$m\n";
    }
} else {
    print "nothingFound";
}
于 2013-03-26T13:07:05.283 に答える