1

私はperlスクリプトでテキストファイルを作成し、キャプチャした行をガベージコレクションログから書き込み、アーカイブ/タイムスタンプされたフォルダに保存します。ファイルには、次のような行が含まれます。

413489.272:[GC [PSYoungGen:323892K-> 3126K(332352K)] 623290K-> 303976K(1031424K)、0.0253970秒] [時間:user = 0.03 sys = 0.00、real=0.02秒]

413503.531:[GC [PSYoungGen:319094K-> 7280K(333760K)] 619944K-> 310249K(1032832K)、0.0614640秒] [時間:ユーザー= 0.06 sys = 0.00、実数=0.06秒]

413521.441:[GC [PSYoungGen:324592K-> 6867K(333056K)] 627561K-> 310363K(1032128K)、0.0574120秒] [時間:user = 0.06 sys = 0.00、real=0.06秒]

                                       ...

私がやりたいのは、ファイル内のこれらの行を反復処理し、正規表現を使用して「リアルタイム」時間の値(たとえばreal=0.06 secs、0.06のみ)を取得し、それを$time変数に格納することです。私は、前向きな後ろ向きがこれに対してうまくいくと思います、のようなものです/(?<=real=)\d\.\d\d/が、それはうまくいきません。

結局、私のスクリプトは次の行に沿って見えます。

open LOG,"<","./report/archive/reports-$now/gclog.txt" or die "Unable to read file: $!";
    #while there is lines in the file
        #regex to match time value -> store in variable
        #print variable (just as a check for now)
        #some other stuff not really relevant to this question
close LOG;

私はperlにかなり慣れていないので、どんな助けでも大歓迎です!

4

1 に答える 1

4

ネガティブな見方は必要ありません。キャプチャするだけです。

使用する:

my ($time) = /\breal=([0-9.]+)/;

これ\bはおそらく必要ではありませんが、万が一の場合に備えて、常に単語の境界を一致させることを好みます。

配列として返される()出力をキャプチャします。次に、戻り値を。という名前の変数に入れます$time。キャプチャ値はで使用することもできますが$1、この方法で返すことをお勧めします。

于 2012-08-07T14:22:48.113 に答える