【问题标题】:How do apply the flip-flop operator to cat output?如何将触发器运算符应用于 cat 输出?
【发布时间】:2013-10-14 18:14:22
【问题描述】:

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

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

(如你所见,我对 perl 不熟悉)

我想扫描结果变量(日志)以查找回溯部分。这些部分存在于文本:“backtrace”和以下空行之间。

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

【问题讨论】:

  • 你不需要cat输出。在标量上下文中使用反引号(或qx())时,默认连接多行输出。相反,在列表上下文中,您会得到一个行列表。这可能对您有用。

标签: perl


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我假设你想要的是构造的等价物

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

      这样做的好处是您不必将整个输出读入内存。

    【讨论】:

      猜你喜欢
      • 2017-08-05
      • 1970-01-01
      • 2018-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多