如何在 Raku 中将字符串向右对齐并在太长时将其截断?

men*_*fon 6 raku

重要的是,我希望保持对齐,因此字符串会从左侧被切断。我尝试过substr,但如果字符串不够长,就会崩溃。目前我有一个类似的解决方案:

> my $xs = (0..4).kv.map(-> $i, $x { ('a'..'z')[0..$i-1].join })
( a ab abc abcd)
> $xs.map({ sprintf '%3.3s', $_ }).raku
("   ", "  a", " ab", "abc", "abc").Seq
Run Code Online (Sandbox Code Playgroud)

但问题是,字符串仍然从右侧而不是左侧被截断(截断的行为就像向左对齐,而不是向右对齐)。我正在寻找会返回的东西:

("   ", "  a", " ab", "abc", "bcd")
Run Code Online (Sandbox Code Playgroud)

不同之处在于最后一项,其中“abcd”中的“a”应该被截断,而不是“d”。

cod*_*ons 5

您可以通过几种不同的方式来实现这一点,但我可能会将其分解为两个操作: \xe2\x91\xa0 取最后 3 个字符(如果有):.comb.tail(3).join; \xe2\x91\xa1 使用空格填充格式化输出:.fmt("%3s")

\n

将其放在一行中会将第二行替换为:

\n
 > $xs.map({ .comb.tail(3).join.fmt("%3s")}).raku\n("   ", "  a", " ab", "abc", "bcd").Seq\n
Run Code Online (Sandbox Code Playgroud)\n

另一种选择(避免往返列表)是首先添加填充:

\n
 > $xs.map({.fmt("%3s").substr(*-3, *)}).raku\n("   ", "  a", " ab", "abc", "bcd").Seq\n
Run Code Online (Sandbox Code Playgroud)\n

(哦,你没有问过这一点,但在许多情况下,将字符串列表保存到@xs变量而不是变量中可能更惯用 Raku)$xs

\n