如何将触发器操作器应用于cat输出?

时间:2013-10-14 18:14:23

标签: perl

我正在使用perl解析崩溃日志,我想提取回溯组件。我使用以下命令获取日志文件:

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

(我不熟悉perl,你可以看到)

我想扫描生成的变量(log)以获取回溯部分。这些部分存在于文本:“backtrace”和以下空行之间。

我的问题是,如何将触发器操作符应用于局部变量,就像它是文件输入一样?

2 个答案:

答案 0 :(得分:1)

你需要使用触发器操作器吗?正则表达式怎么样?

@backtrace_sections = $log =~ /(^backtrace.*?)\n\n/gm;

答案 1 :(得分:1)

我认为你想要的是构造

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

我认为有两种方法可以做到这一点:

  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: $! $?";
    

    这样做会产生很好的效果,您无需将整个输出读入内存。