You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Raku的for lines()循环中使用ff/fff操作符处理文本

Raku 文本格式转换问题解决

问题根源

你用的^fff^(固定宽度向前查找)操作符是用来匹配连续多行的模式,但代码里是逐行处理单条$line的,单一行不可能满足这个跨多行的匹配条件,所以永远触发不了设置$head-info的分支。

正确实现思路

通过状态变量跟踪当前处于哪个阶段(是否刚跳过虚线、等待读取标题),逐行处理时根据状态执行对应逻辑:

  • 遇到虚线行:切换"等待标题"的状态
  • 处于"等待标题"状态时:当前行就是标题,存入$head-info并关闭等待状态
  • 其他情况:输出标题加内容行

修正后的代码

#!/usr/bin/env raku

my $head-info;
my $waiting-for-heading = False;

for lines() -> $line {
    given $line {
        when /^ '-' **16 $/ {
            $waiting-for-heading = !$waiting-for-heading;
            next;
        }
        when $waiting-for-heading {
            $head-info = $line;
            $waiting-for-heading = False;
            next;
        }
        default {
            say "$head-info: $line" if $head-info;
        }
    }
}

代码说明

  1. 虚线行处理:每次遇到16个减号的行,就翻转$waiting-for-heading的状态——第一次遇到虚线后,下一行就是标题;第二次遇到虚线后,接下来是内容行。
  2. 标题行处理:当处于等待标题状态时,把当前行赋值给$head-info,并关闭等待状态,避免后续行被误判为标题。
  3. 内容行处理:只有当$head-info已经被设置时才输出,避免程序开头还没读取到标题时产生空输出。

内容的提问来源于stack exchange,提问作者Norman Gaywood

火山引擎 最新活动