You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 13:27:40