问题描述
我有一些名为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