0

perl を使用してクラッシュ ログを解析しており、バックトレース コンポーネントを抽出したいと考えています。次のコマンドを使用してログ ファイルを取得します。

$log = `adb shell 'ls -d ./tombstones/*' |grep tombstone_ | tr '\r' ' ' | tail -n1 | xargs adb shell cat`;

(ご覧のとおり、私はperlに精通していません)

バックトレース セクションの結果の変数 (ログ) をスキャンしたいと思います。これらのセクションは、テキスト「backtrace」と次の空行の間にあります。

私の質問は、フリップフロップ演算子をファイル入力のようにローカル変数に適用するにはどうすればよいですか?

4

2 に答える 2

1

あなたが望むのは、コンストラクトに相当するものだと思います

while (<>) {
    if (m/backtrace/ .. m/^$/) {
        # processing
    }
}

これを行うには、次の 2 つの方法があります。

  1. 配列コンテキストでバックティック演算子を使用します。

    my @lines = qx{$your_command};
    for (@lines) {
        if (m/backtrace/ .. m/^$/) {
            # process
        }
    }
    
  2. を使用openしてファイルを開きます。

    open my $fh, '-|', qq{$your_command} or die "Can't open command: $!";
    while (<$fh>) {
        if (m/backtrace/ .. m/^$/) {
            # process
        }
    }
    close $fh or die "close failed: $! $?";
    

    このようにすると、出力全体をメモリに読み込む必要がないという優れた効果があります。

于 2013-10-15T14:34:07.333 に答える