Perl:如何在两个相同模式之间打印行?

问题描述

我有一些名为data_range.txt的数据。最终,我想将数据加载到数组中并比较字符串。但是,我无法打印两个图案之间的线。

--
2020-10-07T22:14:27,545 DEBUG [recvMsgProc-0] <KdbQMHandler> calling:parameters=191216CV0
2020-10-07T22:14:27,554 INFO  [recvMsgProc-0] <KdbQMHandler> resultkx.Flip@
--
2020-10-07T22:43:12,345 DEBUG [recvMsgProc-1] <KdbQMHandler> calling:parameters=00774MAB1
2020-10-07T22:43:12,354 INFO  [recvMsgProc-1] <KdbQMHandler> resultkx.Flip@
--
2020-10-07T22:44:02,028 DEBUG [recvMsgProc-0] <KdbQMHandler> calling:parameters=00774MAB1
2020-10-07T22:44:02,036 INFO  [recvMsgProc-0] <KdbQMHandler> resultkx.Flip@
--
2020-10-07T22:55:10,691 DEBUG [recvMsgProc-1] <KdbQMHandler> calling:parameters=71647NBE8
2020-10-07T22:55:10,703 INFO  [recvMsgProc-1] <KdbQMHandler> resultkx.Flip@
--

我有一个脚本,当我尝试在两种不同的模式之间进行打印时,通常可以使用该脚本,但是这些模式是相同的。

#!/usr/bin/perl
use warnings;
use strict;

my $file = 'data_range.txt';
open my $fh,$file  or die "Can't open $file: $!";

# Build the start and end patterns
my $beg = qr/--/;
my $end = qr/--/;

while (<$fh>)
{
    if (/$beg/ .. /$end/) {
        print if not /$end/;
    }
}

解决方法

您需要稍微修改一下条件,以免每隔第二部分就跳过

['x','(','4','+','1',')',' ','x','5','=','6',')']

但是放弃范围运算符而改用输入记录分隔符可能会更干净:

if (/--/ .. /--/ && next) {
    print;
}
,

使用grep预处理输入以删除--行,并使用paste将输入更改为每行2条记录的文件,默认情况下在选项卡上联接。通过在选项卡上将记录拆分为每行2条记录的数组,可以轻松解析结果。

grep -v '^--' data_range.txt | paste - - | perl -F'\t' -lane 'print join "\t",map { qq{"$_"} } @F;'

# Prints:

"2020-10-07T22:14:27,545 DEBUG [recvMsgProc-0] <KdbQMHandler> calling:parameters=191216CV0"     "2020-10-07T22:14:27,554 INFO  [recvMsgProc-0] <KdbQMHandler> resultkx.Flip@"
"2020-10-07T22:43:12,345 DEBUG [recvMsgProc-1] <KdbQMHandler> calling:parameters=00774MAB1"     "2020-10-07T22:43:12,354 INFO  [recvMsgProc-1] <KdbQMHandler> resultkx.Flip@"
"2020-10-07T22:44:02,028 DEBUG [recvMsgProc-0] <KdbQMHandler> calling:parameters=00774MAB1"     "2020-10-07T22:44:02,036 INFO  [recvMsgProc-0] <KdbQMHandler> resultkx.Flip@"
"2020-10-07T22:55:10,691 DEBUG [recvMsgProc-1] <KdbQMHandler> calling:parameters=71647NBE8"     "2020-10-07T22:55:10,703 INFO  [recvMsgProc-1] <KdbQMHandler> resultkx.Flip@"

Perl单行代码使用以下命令行标志:
-e:告诉Perl在代码中而不是在文件中查找代码。
-n:一次遍历输入一行,默认情况下将其分配给$_
-l:在直接执行代码之前,先剥离输入行分隔符(默认为* NIX上的"\n"),并在打印时附加它。 -a:在空白或$_选项中指定的正则表达式上,将@F拆分为数组-F
-F'/\t/':在TAB上分成@F,而不是在空白处。

另请参见:
perldoc perlrun: how to execute the Perl interpreter: command line switches