如何在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; } } }
代码说明
- 虚线行处理:每次遇到16个减号的行,就翻转
$waiting-for-heading的状态——第一次遇到虚线后,下一行就是标题;第二次遇到虚线后,接下来是内容行。 - 标题行处理:当处于等待标题状态时,把当前行赋值给
$head-info,并关闭等待状态,避免后续行被误判为标题。 - 内容行处理:只有当
$head-info已经被设置时才输出,避免程序开头还没读取到标题时产生空输出。
内容的提问来源于stack exchange,提问作者Norman Gaywood




