Perl技术问题:如何打印两个相同分隔符--之间的内容?
问题分析
你的脚本失效的核心原因是Perl的范围操作符..在起始和结束模式完全相同时,会出现逻辑冲突——当它匹配到第一个--时开启范围,紧接着下一个--会同时触发范围结束,并且立刻又开启新的范围,导致中间的行无法被正确筛选。
解决方案:用状态变量跟踪目标区块
我们可以改用一个状态变量手动控制是否处于需要提取的区块内,这样就能精准处理相同起始/结束模式的场景。修改后的脚本如下:
#!/usr/bin/perl use warnings; use strict; my $file = 'data_range.txt'; open my $fh, $file or die "Can't open $file: $!"; my $in_block = 0; # 状态开关:0=不在目标区块,1=在目标区块 while (<$fh>) { if (/^--$/) { # 匹配单独一行的--(避免误匹配行内包含--的情况) $in_block = !$in_block; # 翻转状态:进入/退出区块 next; # 跳过--本身的行,不输出 } print $_ if $in_block; # 仅当在区块内时打印当前行 } close $fh;
代码细节解释
$in_block作为状态标记,初始为0表示不在目标数据区块。- 当匹配到单独一行的
--时,翻转状态:如果之前不在区块就进入,在区块就退出。 next语句确保我们不会输出--这一行本身。- 只有当
$in_block为1时才打印行,这样就精准提取了两个--之间的所有内容。
测试验证
用你提供的示例数据运行这个脚本,输出结果会是:
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@
完全符合你提取两个--之间行的需求,之后你就可以把这些行加载到数组里进行字符串比较了。
内容的提问来源于stack exchange,提问作者capser
相关产品推荐
相关产品推荐

