gpt4 book ai didi

tabs - perl6 如何获取所有未按空格的 x 宽度缩进的行?

转载 作者:行者123 更新时间:2023-12-04 22:42:31 25 4
gpt4 key购买 nike

我有一个非常非常大的文本文件,我正在处理它,其中包含具有各种大小缩进的行。那些可接受的行具有 12 个字符宽度的缩进,这些缩进由制表符和空格组合而成。现在我想获得所有没有 12 个字符宽度的缩进,这些行从制表符和空格字符的组合中获得从 0 到 11 个字符宽度的缩进。

if $badLine !~~ m/ ^^ [\s ** 12 ||
\t \s ** 4 ||
\s \t \s ** 3 ] / { say $badLine; }

但问题是,当您使用文字处理器处理文本文件时,按 Tab 键可以为您提供 0 到 8 个空格字符宽度以填补空白。获取所有那些没有 12 字符宽度缩进的 Not Acceptable 行的聪明方法是什么?

谢谢。

最佳答案

宽12

对于 12 的缩进宽度,假设制表位位于 0、8、16 等位置:

for $input.lines {
.say if not /
^ # start of line
[" " ** 8 || " " ** 0..7 \t] # whitespace up to first tab stop
[" " ** 4] # whitespace up to position 12
[\S | $] # non-space character or end of line
/;
}

解释:
  • 要从行首(位置 0)到第一个制表位(位置 8),我们需要匹配两种可能性:
  • 8个空间。
  • 0 到 7 个空格,后跟 1 个制表符。 (制表符直接跳到制表位,因此它会填充空格后剩余的任何宽度。)
  • 从制表位(位置 8)到缩进目标(位置 12)的唯一方法是 4 个空格。 (制表符将跳过目标到位置 16 处的下一个制表位。)
  • anchor 定到行首以及缩进之后的任何内容都很重要,这样我们就不会意外地匹配较长缩进的一部分。

  • 任意宽度

    缩进匹配可以分解为参数化 named token可以处理任意宽度:

    my token indent ($width) {
    [" " ** 8 || " " ** 0..7 \t] ** {$width div 8}
    " " ** {$width % 8}
    }

    .say if not /^ <indent(12)> [\S | $]/ for $input.lines;

    解释:
  • 与上面相同的表达式用于到达第一个制表位,但现在根据需要重复多次以到达目标之前的最后一个制表位。 (总共 $width div 8 次,其中 div 是整数除法运算符)。
  • 无论最后一个制表位与目标之间的距离如何,都必须用空格填充。 ( $width % 8 空格,其中 % 是模运算符。)

  • 任意位置和宽度

    上面示例中的标记假定它从制表符停止位置(例如行首)开始匹配。它可以进一步推广以匹配给定宽度的制表符和空格,无论您在行中的哪个位置调用它:

    my token indent ($width) {  
    :my ($before-first-stop, $numer-of-stops, $after-last-stop);
    {
    $before-first-stop = min $width, 8 - $/.from % 8;
    $numer-of-stops = ($width - $before-first-stop) div 8;
    $after-last-stop = ($width - $before-first-stop) % 8;
    }
    [" " ** {$before-first-stop} || " " ** {^$before-first-stop} \t]
    [" " ** 8 || " " ** 0..7 \t] ** {$numer-of-stops}
    " " ** {$after-last-stop}
    }

    解释:
  • 原理和以前一样,除了现在我们首先需要匹配尽可能多的空格,以便从字符串中的当前位置到它后面的第一个制表位。
  • 字符串中的当前位置由 $/.from 给出;剩下的就是简单的算术。
  • 在 token 中声明并使用了一些词法变量(希望具有描述性名称),以使代码更易于理解。
  • 关于tabs - perl6 如何获取所有未按空格的 x 宽度缩进的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41907542/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com