Raku的字符串范围运算符能否实现与Perl一致的行为?
差异原因
Raku的..范围运算符对字符串输入的默认逻辑是固定长度逐位递进:仅逐位调整字符,每一位到边界后进位,不会自动遍历低位的所有组合,所以会出现"aa" .. "bb"只输出aa ab ba bb的情况。而Perl的字符串范围默认使用「魔性字符串递增」逻辑,会完整遍历所有符合字符顺序的组合。
解决方案
使用Raku的...序列生成器,显式指定以succ方法(对应Perl的字符串递增逻辑)作为递进规则,即可得到和Perl完全一致的结果:
字符串场景示例
# 等价于Perl的 "aa" .. "bb" my @alpha-range = "aa", *.succ ... "bb"; # 输出内容:aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb
数字字符串场景示例
不需要提前转Int,用同样的规则即可实现预期效果:
# 等价于Perl的 "12" .. "23" my @num-range = "12", *.succ ... "23"; # 输出内容:"12" "13" "14" ... "22" "23"
快捷封装(可选)
如果需要频繁使用类Perl的范围逻辑,可以自定义一个专用运算符简化调用:
sub infix:<..p>($start, $end) { $start, *.succ ... $end } # 直接调用即可 say "aa" ..p "bb"; say "12" ..p "23";
内容的提问来源于stack exchange,提问作者Nikola Benes
相关产品推荐
相关产品推荐

